Rails where()子句关于模型关联?

Der*_*k J 42 ruby-on-rails

假设我有一个拥有多个用户的帐户模型.帐户有一个布尔"活动"列.如何让所有属于"活动"帐户的用户?

@users_of_active_accounts = User.?
Run Code Online (Sandbox Code Playgroud)

谢谢!

Dog*_*ert 81

试试这个:

User.joins(:account).where(:accounts => { :active => true })
Run Code Online (Sandbox Code Playgroud)

  • 一些可能也有帮助的注释:i) `.joins(:account)` :account 应该是单数或复数,具体取决于关联(例如,单数表示 has_one,复数表示 has_many),ii) `.where(:accounts. .` 这里的账户指的是表格,所以总是复数。希望可以节省某人一两分钟。(如果我在这方面有任何错误,请纠正我) (2认同)

Sim*_*tsa 51

您需要加入帐户表并合并适当的帐户范围:

User.joins(:account).merge(Account.where(:active => true))
Run Code Online (Sandbox Code Playgroud)

  • 如果你有一个命名范围,你也可以使用它,例如`User.joins(:account).merge(Account.active)` (4认同)
  • @SimonPerepelitsa应该是`:accounts`? (3认同)

Jar*_*ard 10

在Account模型的关联中使用where子句:

class Account < ActiveRecord::Base
  has_many :users, -> {where(active: true)}
Run Code Online (Sandbox Code Playgroud)

其他查询将起作用,但如果您始终关心活动用户,则在关联级别进行过滤将正确封装过滤器,并在将来避免您的头痛.

更新:

您还可以在同一个表上指定2个关系:

 class Account < ActiveRecord::Base
   has_many :users
   has_many :active_users, -> {where(active: true)}, :class_name => 'User'
Run Code Online (Sandbox Code Playgroud)

第二次更新:

在重新阅读问题之后,我现在看到我的答案没有回答这个问题.这是我对这个问题的回答:

User.where(account: Account.where(active: true))
Run Code Online (Sandbox Code Playgroud)

第3次更新:这是一个具有active_users属性的用户模型示例

class User < ActiveRecord::Base
  belongs_to :account
  def self.active
    where(account: Account.where(active: true))
  end
end
Run Code Online (Sandbox Code Playgroud)

这样做可以让它与其他用户查询内联:

User.active.where(created_at: (1.week.ago..0.day.ago)).count
Run Code Online (Sandbox Code Playgroud)

  • 我相信第三次更新可以写成范围。`scope :active, -&gt; { where(account: Account.where(active: true)) }` (2认同)