假设我有两个模型
class Client < ActiveRecord::Base
has_many :accounts
end
class Account < ActiveRecord::Base
belongs_to :client
end
现在,我希望有方便的方法来访问已批准的帐户(:approved =&gt; true)。 什么是更好的使用,为什么?
has_many: approved_accounts, -> { where :approved => true }
代表Client
模型
scope: approved, -> { where :approved => true }
代表Account
模型答案 0 :(得分:1)
据我所知,scope
解决方案似乎更好:
正如您可能知道的那样,要获得客户的已批准帐户,您可以执行以下操作:approved_accounts = client.accounts.approved
,其清晰度不低于:approved_accounts = client.approved_accounts
所以这里差别不大。但是,如果将来您需要所有已批准帐户的列表(用于统计或其他),使用范围解决方案,只需一个approved_accounts = Account.approved
即可。但是如果你选择客户端,那么获取它会更加棘手(理解:你将不得不使用客户端模型)。
考虑到被批准是账户的财产而不是客户的财产,并且应该更清楚地认为范围是最佳解决方案。
希望这能澄清事情。
答案 1 :(得分:1)
简短回答,取决于。如果答案很长,请仔细阅读...
条件关联允许我们自定义ActiveRecord
将用于获取关联的查询。当您确定这种情况是永久性的时候使用&amp;您将永远不需要访问不符合条件的数据(至少不在此模型中),因为条件关联适用于ActiveRecord
对该特定模型的关联的每个查询。
范围基本上,它是一种检索和查询对象的类方法。所以你实际做的是在你的模型中定义以下方法。
class Client < ActiveRecord::Base
self.approved
where(:approved => true)
end
end
所以scope
通常用于为一个或多个常用查询自定义定义短名称。但重要的区别是scope
不会自动应用,除非您使用default_scope
,但会自动应用条件关联。
在您的情况下,您想在此模型中显示未批准的帐户?如果没有,则使用条件关联。否则使用scope