Ruby:如果它不在数组B中,如何从数组A中删除项目?

我准备了这两个数组:

list_of_students = Student.where('class = ?', param[:given_class]) list_of_teachers = Teacher.where(...) 

Student are_to TeacherTeacher students

现在,我需要从list_of_students删除所有项目(学生),其中teacher_id不包含在list_of_teachers

我在比较数组时发现了一些提示和HOWTO,但没有一个能够帮助我们弄清楚这种情况。

先感谢您

您可以使用IN SQL语句。

 list_of_students = Student.where('class = ? AND teacher_id IN (?)', param[:given_class], list_of_teachers.map(&:id)) 

如果list_of_teachersActiveRecord::Relation (而不是数组),您还可以使用#pluck(:id)或(来自Rails 4) #ids

 Student.where('class = ? AND teacher_id IN (?)', param[:given_class], list_of_teachers.ids) 

有几种方法可以编写IN语句。 鉴于你已经有了一个where ,我加入了主要的地方。 但你也可以写

 Student.where('class = ?', param[:given_class]).where(teacher_id: list_of_teachers) 

要么

 Student.where(class: param[:given_class], teacher_id: list_of_teachers) 

另请注意,您无需将教师列表分配给变量。

 Student.where(class: param[:given_class], teacher_id: Teacher.where(...).ids) 

最后但并非最不重要的是,如果您的Teacher查询很简单,您可能希望使用单个查询和JOIN。 假设您希望获得名为Rose所有教师。

 Student.where(class: param[:given_class], teacher_id: Teacher.where(name: 'Rose').ids) 

您可以重写相同的查询

 Student.where(class: param[:given_class]).joins(:teacher).where(teacher: { name: 'Rose' }) 

或(最后和较短的表达)

 Student.joins(:teacher).where(class: param[:given_class], teacher: { name: 'Rose' }) 

你可以尝试类似的东西

 a = [1,2,3] b = [1,4,5] pry(main)> a.delete_if {|a1| !b.include? a1} => [1] 

它检查a中的每个值是否为b。 如果没有,它会删除a中的值并最终为您提供一个数组。

这是一个例子。 你可以相应地使用它