11
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 以反映模型,但它应该是表名吗?

4

3 回答 3

19

这里有两个问题:

  1. 对多态关联求和。
  2. 多态关联的条件。

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

  1. Transactions.count(:all, :joins => :account)
  2. 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, 
  :select => "transactions.amount", 
  :conditions => "bankaccounts.status = 'active'", 
  :joins => :transaction
)

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

于 2010-08-22T20:18:33.877 回答
2

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

因此,您应该始终将预加载用于多态关联。

于 2017-10-19T20:49:49.013 回答
0

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

于 2014-12-17T13:03:15.373 回答