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 子句中。表名是bankaccounts 和creditcards,这是否意味着它们应该是单数?另外,account_type 是一个银行帐户或信用卡的字符串来反映模型,但它应该是表名吗?

有帮助吗?

解决方案

这里有两个问题:

  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
)

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

其他提示

其他泛的答案,你甚至可以做一个工会,而不是增加他们的。其中只执行一个查询

对于那些拿到即使他们是不是要查询的多态关联条件下,这种错误,是因为包括决定打电话eager_load时多态关联仅受预紧支持。这是在文档中的位置: http://api.rubyonrails.org/ V5.1 /类/ ActiveRecord的/ EagerLoadPolymorphicError.html

所以,你应该始终使用预载多态关联。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top