【问题标题】:ActiveRecord::EagerLoadPolymorphicError: Can not eagerly load the polymorphic associationActiveRecord::EagerLoadPolymorphicError: 不能急切加载多态关联
【发布时间】:2010-01-17 03:32:22
【问题描述】:
class Transaction < ActiveRecord::Base
  belongs_to :account, :polymorphic => true
end

class Bankaccount < ActiveRecord::Base
  has_many :transactions, :as => :account
end

class Creditcard < ActiveRecord::Base
  has_many :transactions, :as => :account
end

尝试对帐户处于活动状态的交易进行汇总。

Transaction.sum(:all, :conditions => "account.status = 'active'", :include => :account)

所以在阅读了一些内容后,我发现了这个: 原因是父模型的类型是列值,因此其对应的表名不能放在该查询的 FROM/JOIN 子句中。 表名是银行账户和信用卡,这是否意味着它们应该是单数? account_type 也是一个字符串,可以是 Bankaccount 或 Creditcard 以反映模型,但它应该是表名吗?

【问题讨论】:

    标签: ruby-on-rails activerecord polymorphic-associations


    【解决方案1】:

    这里有两个问题:

    1. 对多态关联求和。
    2. 基于多态关联的条件。

    你实际上不能做这两件事。所以你应该通过执行这两个查询得到同样的错误:

    1. Transactions.count(:all, :joins => :account)
    2. Transactions.find(:all, :conditions => "accounts.status = 'active'", :joins => :account)

    要真正获得您需要的信息,您必须明确列出可能的父多态关联。一种方法是简单地使用 SQL 和 LEFT JOINS,这样您就可以使用单个查询。使用 Rails,这可以通过两个查询来执行:

    Creditcard.sum(
      :all, 
      :select => "transactions.amount", 
      :conditions => "creditcards.status = 'active'", 
      :joins => :transaction
    ) + Bankaccount.sum(
      :all, 
      :select => "transactions.amount", 
      :conditions => "bankaccounts.status = 'active'", 
      :joins => :transaction
    )
    

    P.S:如果您不打算在查询后访问连接的对象,最好使用 :join 而不是 :include。

    【讨论】:

    • 感谢您回答我的问题,是的,最终还是走了同样的路。再次感谢潘:D
    • 正确。另请查看加入多态模型的答案:stackoverflow.com/a/22995162/293280
    【解决方案2】:

    对于那些即使没有尝试查询多态关联的条件也得到此错误的人,这是因为当多态关联仅由预加载支持时,includes 决定调用 eager_load。它在此处的文档中:http://api.rubyonrails.org/v5.1/classes/ActiveRecord/EagerLoadPolymorphicError.html

    因此,对于多态关联,您应该始终使用预加载。

    【讨论】:

      【解决方案3】:

      除了潘的答案,你甚至可以做一个联合而不是添加它们。只执行一个查询

      【讨论】:

        猜你喜欢
        • 2010-12-01
        • 2017-08-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-16
        • 2017-12-26
        • 2014-11-14
        • 1970-01-01
        相关资源
        最近更新 更多