Ruby:如果它不在数组B中,如何从数组A中删除项目?
我准备了这两个数组:
list_of_students = Student.where('class = ?', param[:given_class]) list_of_teachers = Teacher.where(...)
Student
are_to Teacher
和Teacher
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_teachers
是ActiveRecord::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中的值并最终为您提供一个数组。
这是一个例子。 你可以相应地使用它