2010-01-17 114 views
9
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 

试图对帐户处于活动状态的交易进行求和。ActiveRecord :: EagerLoadPolymorphicError:无法加载多态关联

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

所以一些阅读后,我遇到了这个: 的原因是父模型的类型是列值,因此其对应的表名不能被放在FROM /加入该查询的WHERE子句。 表名是bankaccounts和creditcards,这是否意味着它们应该是单数? 此外,account_type是一个字符串Bankaccount或Creditcard来反映模型,但它应该是表名吗?

回答

18

这里有两个问题:

  1. 总结了多态关联。
  2. 关于多态关联的条件。

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

  1. Transactions.count(:全部:加入=>:帐户)
  2. Transactions.find(:全部:条件=>“账户。 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:这是最好的使用方法:加入的,而不是:包括,如果你不上查询后访问对象加盟计划。

+0

谢谢你回答我的问题,是的,最终走了同样的路线。再次感谢潘:D – bordicon 2010-08-23 06:11:06

+0

Spot on。另请参阅加入多态模型的答案:http://stackoverflow.com/a/22995162/293280 – 2014-04-10 17:50:03

0

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