ActiveRecord::EagerLoadPolymorphicError:无法急切加载多态关联
-
21-09-2019 - |
题
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 是一个银行帐户或信用卡的字符串来反映模型,但它应该是表名吗?
解决方案
这里有两个问题:
- 对多态关联进行总结。
- 多态关联的条件。
实际上你不能做这两件事。因此,执行这两个查询应该会得到相同的错误:
- 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,
:select => "transactions.amount",
:conditions => "bankaccounts.status = 'active'",
:joins => :transaction
)
附:如果您不打算在查询后访问连接的对象,最好使用 :join 而不是 :include。
其他提示
其他泛的答案,你甚至可以做一个工会,而不是增加他们的。其中只执行一个查询
对于那些拿到即使他们是不是要查询的多态关联条件下,这种错误,是因为包括决定打电话eager_load时多态关联仅受预紧支持。这是在文档中的位置: http://api.rubyonrails.org/ V5.1 /类/ ActiveRecord的/ EagerLoadPolymorphicError.html
所以,你应该始终使用预载多态关联。
不隶属于 StackOverflow