在范围中使用OR与查询

dj.*_*dj. 2 activerecord ruby-on-rails ruby-on-rails-3

在Rails3中我有:

Class Teacher
  #  active                 :boolean
  has_and_belongs_to_many :subjects

Class Subject
  #  active                 :boolean
  has_and_belongs_to_many :teachers
Run Code Online (Sandbox Code Playgroud)

我正在尝试构建一个教师范围,它返回与之相关的所有Teachers内容active或与之相关联的Subject内容active.

这些范围单独工作,但如何将它们作为单个范围与OR组合?

scope :active_teachers, where(active: true)
scope :more_active_teachers, joins(:subjects).where(:subjects => {active: true})
Run Code Online (Sandbox Code Playgroud)

我试过这个没有成功:

scope :active_teachers, where(active: true).or(joins(:subjects)
      .where(:subjects => {active: true}))
Run Code Online (Sandbox Code Playgroud)

更新:

我以为我有一个解决方案,但这不再是懒惰的负载,两次点击数据库 - 最重要的是 - 返回一个数组而不是一个AR对象!

scope :active_teachers, where(active: true) |
                        joins(:subjects).where(:subjects => {active: true})
Run Code Online (Sandbox Code Playgroud)

pun*_*yal 5

你需要Squeel救援.更多细节在这里.

使用它,您可以定义如下内容:

class Teacher
  ...
  scope :active_teachers, joins{subjects}.where {(active == true) | (subjects.active == true)}
  ...
end
Run Code Online (Sandbox Code Playgroud)