Reputation: 183
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
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
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