【问题标题】:Conditional associations or scope?条件关联或范围?
【发布时间】:2013-08-04 14:52:36
【问题描述】:

假设我有两个模型

class Client < ActiveRecord::Base
  has_many :accounts
end

class Account < ActiveRecord::Base
  belongs_to :client
end

现在,我想要一种方便的方法来访问已批准的帐户(:approved => true)。 什么更好用,为什么?

  1. has_many: approved_accounts, -&gt; { where :approved =&gt; true }Client 型号

  2. scope: approved, -&gt; { where :approved =&gt; true } 代表Account 型号

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    简短回答,视情况而定。对于长答案,请继续阅读...

    • 条件关联 允许我们自定义ActiveRecord 将用于获取关联的查询。当您确定此条件是永久性的并且您永远不需要访问不符合条件的数据时使用(至少不在此模型中),因为条件关联适用于对ActiveRecord 的每个查询对关联进行从那个特定的模型。

    • Scope 它基本上是一个用于检索和查询对象的类方法。所以你实际上在做的是在你的模型中定义以下方法。

      class Client < ActiveRecord::Base self.approved where(:approved => true) end end

    所以scope 通常用于为一个或多个经常使用的查询自定义定义短名称。但重要的区别是 scope 不会自动应用,除非您使用 default_scope 但条件关联是自动应用的。

    在您的情况下,您想在此模型中显示未批准的帐户吗?如果不是,则使用条件关联。否则使用scope

    【讨论】:

      【解决方案2】:

      在我看来,scope 解决方案似乎更好:

      您可能知道,要获得客户的批准帐户,您可以执行以下操作:approved_accounts = client.accounts.approved,其易读性不低于:approved_accounts = client.approved_accounts

      所以这里没有太大区别。但是,如果将来您想要所有已批准帐户的列表(用于统计或其他),使用范围解决方案,一个 approved_accounts = Account.approved 就足够了。但是如果你选择客户端,获取起来会比较麻烦(理解:你将不得不使用客户端模型)。

      请考虑比被批准更多的是帐户的财产而不是客户的财产,并且应该更清楚的是范围是最佳解决方案。

      希望这可以澄清事情。

      【讨论】:

        猜你喜欢
        • 2012-08-29
        • 1970-01-01
        • 1970-01-01
        • 2016-04-15
        • 2015-07-15
        • 2013-06-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多