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

class Transaction  true end class Bankaccount  :account end class Creditcard  :account end 

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

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

所以经过一些阅读后我发现了这个:原因是父模型的类型是一个列值,因此它的相应表名不能放在该查询的FROM / JOIN子句中。 表名是bankaccounts和creditcards,这是否意味着它们应该是单数的? 另外,account_type是一个字符串Bankaccount或Creditcard来反映模型,但它应该是tablename吗?

这里有两个问题:

  1. 总结一个多态关联。
  2. 多态关联的条件。

你实际上无法做到这两件事。 因此,您应该通过执行以下两个查询来获得相同的错误:

  1. Transactions.count(:all,:join =>:account)
  2. Transactions.find(:all,:conditions =>“accounts.status =’active’”,:join =>: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 ) 

PS:最好使用:join而不是:include如果你不打算在查询后访问连接对象。

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

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

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