ActiveRecord :: EagerLoadPolymorphicError: не может быстро загрузить полиморфную ассоциацию - PullRequest
11 голосов
/ 17 января 2010
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, отражающая модель, но должна ли она быть вместо имени таблицы?

Ответы [ 3 ]

19 голосов
/ 23 августа 2010

Здесь есть два вопроса:

  1. Суммирование по полиморфной ассоциации.
  2. Состояние по полиморфной ассоциации.

Вы не можете сделать ни одну из этих вещей. Таким образом, вы должны получить ту же ошибку, выполнив эти два запроса:

  1. Transactions.count (: all,: joins =>: account)
  2. Transactions.find (: все,: условия => "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
)

P.S: Лучше всего использовать: join вместо: include, если вы не планируете доступ к присоединенным объектам после запроса.

0 голосов
/ 19 октября 2017

Для тех, кто получил эту ошибку, даже если они не пытаются запросить условия для полиморфной ассоциации, это потому, что включает в себя решение вызвать eager_load, когда полиморфные ассоциации поддерживаются только предварительной загрузкой. Это в документации здесь: http://api.rubyonrails.org/v5.1/classes/ActiveRecord/EagerLoadPolymorphicError.html

Таким образом, вы всегда должны использовать предварительную нагрузку для полиморфных ассоциаций.

0 голосов
/ 17 декабря 2014

В дополнение к ответу Пан, вы можете даже сделать объединение вместо того, чтобы добавить их. который выполняет только один запрос

...