假设我有一个拥有多个用户的帐户模型。帐户有一个布尔“活动”列。如何让所有属于“活动”帐户的用户?
@users_of_active_accounts = User.?
谢谢!
答案 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中了解更多信息。这是introduction和examples。
答案 4 :(得分:0)
尝试一下:
Account.includes(:users).where(active: true)