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

时间:2011-06-13 18:24:35

标签: ruby-on-rails

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

@users_of_active_accounts = User.?

谢谢!

5 个答案:

答案 0 :(得分:79)

试试这个:

User.joins(:account).where(:accounts => { :active => true })

答案 1 :(得分:49)

您需要加入帐户表并合并相应的帐户范围:

User.joins(:account).merge(Account.where(:active => true))

答案 2 :(得分:9)

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

class Account < ActiveRecord::Base
  has_many :users, -> {where(active: true)}

其他查询将起作用,但如果您只关心活跃用户,则在关联级别进行过滤将正确封装过滤器并在将来避免您的麻烦。

更新

您还可以在同一张桌子上指定2个关系:

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

第二次更新:

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

User.where(account: Account.where(active: true))

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

class User < ActiveRecord::Base
  belongs_to :account
  def self.active
    where(account: Account.where(active: true))
  end
end

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

User.active.where(created_at: (1.week.ago..0.day.ago)).count

答案 3 :(得分:0)

可以做到这一点的宝石:activerecord_where_assoc(我是作者)

有了它,您可以按照以下方式做您想做的事情:

@users_of_active_accounts = User.where_assoc_exists(:account, active: true)

如果您在“有效”帐户上有一个范围,则可以这样命名:

@users_of_active_accounts = User.where_assoc_exists(:account, &:active)

因此,现在,如果需要,您可以为此设置一个不错的范围:

class User < ActiveRecord::Base
  belongs_to :account

  scope :active_account, -> { where_assoc_exists(:account, active: true) }
end

@users_of_active_accounts = User.active_account

documentation中了解更多信息。这是introductionexamples

答案 4 :(得分:0)

尝试一下:

Account.includes(:users).where(active: true)