ActiveRecord :: EagerLoadPolymorphicError:无法急切加载多态关联

时间:2010-01-17 03:32:22

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

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子句中。 表名是bankaccounts和creditcards,这是否意味着它们应该是单数的? 另外,account_type是一个字符串Bankaccount或Creditcard来反映模型,但它应该是tablename吗?

3 个答案:

答案 0 :(得分:19)

这里有两个问题:

  1. 总结多态关联。
  2. 多态关联的条件。
  3. 你实际上无法做到这两件事。因此,您应该通过执行以下两个查询来获得相同的错误:

    1. Transactions.count(:all,:joins =&gt;:account)
    2. Transactions.find(:all,:conditions =&gt;“accounts.status ='active'”,:joins =&gt;:account)
    3. 要实际获取所需信息,必须明确列出可能的父多态关联。一种方法是简单地使用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如果您不打算在查询后访问联接对象。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

对于那些即使在他们没有尝试查询多态关联的条件时也会出现此错误的人,因为当只有preload支持多态关联时,包括决定调用eager_load。它位于此处的文档中:http://api.rubyonrails.org/v5.1/classes/ActiveRecord/EagerLoadPolymorphicError.html

所以你应该总是使用preload来进行多态关联。