Ruby on rails 获取具有包含特定值的数组的所有对象

Ruby on rails 获取具有包含特定值的数组的所有对象,ruby-on-rails,ruby,Ruby On Rails,Ruby,我有一个名为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', c

我有一个名为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' }
    ]
  }
]
我试图找出获取包含特定课程id的所有对象的最佳方法

我尝试了
students.where(courses.course_id==“dxgk22452”)
,但运气不佳,找不到关于我具体情况的帖子


最好的办法是什么

您可以迭代两次以选择这些散列,其中它们的
课程
至少包括一个其
课程id
等于
dxgk22452
的散列:

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

您可以迭代两次以选择这些散列,其中它们的
课程
至少包括一个其
课程id
等于
dxgk22452
的散列:

data.select { |e| e[:courses].find { |f| f[:course_id] == 'dxgk22452' } }
给定一个数组:

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' }
    ]
  }
]
返回课程包含给定值的学生:

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' }
    ]
  }
]
给定一个数组:

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' }
    ]
  }
]
返回课程包含给定值的学生:

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' }
    ]
  }
]

在发布代码示例时,请花费额外的时间确保代码有效。我必须更正您的示例中的许多错误才能使其有效。如果目标
:课程id
'dxgk22452'
,我假设您希望返回
[students[0],students[2]]
。对的如果是这样,为了保持代码干燥(不要重复),您可能希望返回
[0,2]
。假设您不打算将返回值链接到另一个方法。发布代码示例时,请花费额外的时间确保代码有效。我必须更正您的示例中的许多错误才能使其有效。如果目标
:课程id
'dxgk22452'
,我假设您希望返回
[students[0],students[2]]
。对的如果是这样,为了保持代码干燥(不要重复),您可能希望返回
[0,2]
。这假设您不打算将返回值链接到另一个方法。