Rigs
Rigs

Reputation: 183

Get all objects that has an array that contains a specific value

I have an array of objects called students that looks like this:

[
  {
    student_id: '1',
    student_name: 'student 1',
    courses: [
      { course_id: 'dxgk22452', course_name: 'courses 1' }, 
      { course_id: 'asdf9d2d', course_name: 'courses 2'},
      { course_id: 'h355dsf4', course_name: 'courses 3'}
    ]
  },
  {
    student_id: '2',
    student_name: 'student 2',
    courses: [
      { course_id: 'asdf9d2d', course_name: 'courses 2'},
      { course_id: 'glld9432d2', course_name: 'courses 4' }
    ]
  },
  {
    student_id: '3',
    student_name: 'student 3',
    courses: [
      { course_id: 'dxgk22452', course_name: 'courses 1' }, 
      { course_id: 'glld9432d2', course_name: 'courses 4' }
    ]
  }
]

I am trying to figure out the best way to get all objects that contain a specific course id.

I tried students.where(courses.course_id == "dxgk22452") with no luck and could not find a post with my specific situation.

What would be the best way to go about this?

Upvotes: 1

Views: 67

Answers (2)

anothermh
anothermh

Reputation: 10574

Given an array:

students = [
  {
    student_id: '1',
    student_name: 'student 1',
    courses: [
      { course_id: 'dxgk22452', course_name: 'courses 1' }, 
      { course_id: 'asdf9d2d', course_name: 'courses 2'},
      { course_id: 'h355dsf4', course_name: 'courses 3'}
    ]
  },
  {
    student_id: '2',
    student_name: 'student 2',
    courses: [
      { course_id: 'asdf9d2d', course_name: 'courses 2'},
      { course_id: 'glld9432d2', course_name: 'courses 4' }
    ]
  },
  {
    student_id: '3',
    student_name: 'student 3',
    courses: [
      { course_id: 'dxgk22452', course_name: 'courses 1' }, 
      { course_id: 'glld9432d2', course_name: 'courses 4' }
    ]
  }
]

Return the students whose courses include the given value:

students.select { |student| student[:courses].any? { |course| course[:course_id] == 'dxgk22452' } }
=> [
  {
    student_id: '1',
    student_name: 'student 1',
    courses: [
      { course_id: 'dxgk22452', course_name: 'courses 1' }, 
      { course_id: 'asdf9d2d', course_name: 'courses 2'},
      { course_id: 'h355dsf4', course_name: 'courses 3'}
    ]
  },
  {
    student_id: '3',
    student_name: 'student 3',
    courses: [
      { course_id: 'dxgk22452', course_name: 'courses 1' }, 
      { course_id: 'glld9432d2', course_name: 'courses 4' }
    ]
  }
]

Upvotes: 1

Sebastián Palma
Sebastián Palma

Reputation: 33491

You can iterate twice to select those hashes, where their courses include at least one hash where its course_id is equal to dxgk22452:

data.select { |e| e[:courses].find { |f| f[:course_id] == 'dxgk22452' } }

Upvotes: 2

Related Questions