问题描述
我有2个模型,Account
和User
class Account
has_many :users
end
class User
belongs_to :account
end
我的问题的相关模型详细信息为:
- 每个帐户都有
subscription
类型,可以是standard
,premium
或enterprise
如何正确列出属于Users
帐户的所有premium
?此外,由于可以有任意数量的premium
个帐户,因此我该如何列出 all 个premium
帐户中的所有用户。
我已经尝试了以下几种方法:
Account.where(subscription: "premium").users # undefined method users
User.where(subscription: "premium") # returns nothing
Account.where(subscription: "premium").each do |account|
account.users # seems to return an array?
end
解决方法
您想要的是左内部联接:
User.joins(:account)
.where(accounts: { subscription: "premium" })
这将返回用户表中联接表中具有匹配项的所有记录。
如何正确列出属于高级帐户的所有用户?
如果您的意思是属于特定帐户的用户,则可以在该特定帐户上调用#users
方法。
account = Account.eager_load(:users).find(1)
account.users
,
第一个问题:
列出所有属于高级帐户的用户:
您的第一次尝试(Account.where(subscription: "premium").users
)不起作用,因为Account.where(subscription: "premium")
已经返回了许多帐户,因此列表(更确切地说是ActiveRecord Relation对象)不能调用.users
在那个名单上。您只能通过一个帐户致电.users
您需要一个join
语句来连接两个表。您可以在这里了解更多信息:https://guides.rubyonrails.org/active_record_querying.html#joining-tables
而且,由于您需要用户,因此应该从用户开始。
您的查询应如下所示:
User.joins(:account).where(accounts: {subscription: "premium"})
这将为您拥有拥有订阅类型为premium的帐户的所有用户。
我认为您关于查询的第二个问题完全相同
,此外,由于可以有任意数量的高级帐户,因此我如何列出所有高级帐户中的所有用户。
其他答案很好,另一种选择是在Account
模型中
scope :premium,-> { where(subscription: 'premium') }
和您的查询
User.joins(:account).merge(Account.premium)