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 Teacher和Teacherhas_many students.
现在,我需要从list_of_students所有项目(学生)中删除,其中teacher_id不包括在内list_of_teachers.
我在比较数组时发现了一些提示和HOWTO,但没有一个能够帮助我们找出这种情况.
先感谢您
您可以使用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_teachers是ActiveRecord::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)
| 归档时间: |
|
| 查看次数: |
105 次 |
| 最近记录: |