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

bor*_*con 11 activerecord ruby-on-rails 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
Run Code Online (Sandbox Code Playgroud)

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

Transaction.sum(:all, :conditions => "account.status = 'active'", :include => :account)
Run Code Online (Sandbox Code Playgroud)

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

Pan*_*kos 19

这里有两个问题:

  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
)
Run Code Online (Sandbox Code Playgroud)

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