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来反映模型,但应该是tablename?
解决方法
这里有两个问题:
>对多态关联进行求和.
>多态关联的条件.
你实际上不能做这些事情之一.所以你应该得到相同的错误,执行这两个查询:
> Transactions.count(:all,:joins =>:account)
> 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,:conditions => "bankaccounts.status = 'active'",:joins => :transaction )
P.S:最好使用:join而不是:include,如果您不打算在查询后访问加入的对象.