ActiveRecord::EagerLoadPolymorphicError: Can not eagerly load the polymorphic association

后端 未结 3 1371
小鲜肉
小鲜肉 2021-01-04 12:57
class Transaction < ActiveRecord::Base
  belongs_to :account, :polymorphic => true
end

class Bankaccount < ActiveRecord::Base
  has_many :transactions, :as         


        
相关标签:
3条回答
  • 2021-01-04 13:10

    There are two issues here:

    1. Summing over a polymorphic association.
    2. Condition over a polymorphic association.

    You can't actually do either of these things. So you should get the same error by performing these two queries:

    1. Transactions.count(:all, :joins => :account)
    2. Transactions.find(:all, :conditions => "accounts.status = 'active'", :joins => :account)

    To actually get the information you need you must explicitly list out the possible parent polymorphic associations. One way to do this is to simply use SQL and LEFT JOINS, so that you can use a single query. Using Rails this can be performed with two queries:

    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: It's best to use :join instead of :include if you don't plan on accessing the joined objects after the query.

    0 讨论(0)
  • 2021-01-04 13:26

    Additional to pan's answer, you could even do a union instead of adding them. which executes only one query

    0 讨论(0)
  • 2021-01-04 13:30

    For those that got this error even when they aren't trying to query conditions on the polymorphic association, it's because includes decided to call eager_load when polymorphic associations are only supported by preload. It's in the documentation here: http://api.rubyonrails.org/v5.1/classes/ActiveRecord/EagerLoadPolymorphicError.html

    So you should always use preload for polymorphic associations.

    0 讨论(0)
提交回复
热议问题