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

use*_*621 1 ruby ruby-on-rails rails-activerecord

我准备了这两个数组:

list_of_students = Student.where('class = ?', param[:given_class])
list_of_teachers = Teacher.where(...)
Run Code Online (Sandbox Code Playgroud)

Studentbelongs_to TeacherTeacherhas_many students.

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

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

先感谢您

Sim*_*tti 7

您可以使用INSQL语句.

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

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

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

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

Student.where('class = ?', param[:given_class]).where(teacher_id: list_of_teachers)
Run Code Online (Sandbox Code Playgroud)

要么

Student.where(class: param[:given_class], teacher_id: list_of_teachers)
Run Code Online (Sandbox Code Playgroud)

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

Student.where(class: param[:given_class], teacher_id: Teacher.where(...).ids)
Run Code Online (Sandbox Code Playgroud)

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

Student.where(class: param[:given_class], teacher_id: Teacher.where(name: 'Rose').ids)
Run Code Online (Sandbox Code Playgroud)

您可以重写相同的查询

Student.where(class: param[:given_class]).joins(:teacher).where(teacher: { name: 'Rose' })
Run Code Online (Sandbox Code Playgroud)

或(最终和较短的表达)

Student.joins(:teacher).where(class: param[:given_class], teacher: { name: 'Rose' })
Run Code Online (Sandbox Code Playgroud)