ActiveRecord:: EagerLoadPolymorphicError: не Может нетерпеливо загрузить полиморфную ассоциацию

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)

Таким образом, после некоторого чтения я столкнулся с этим: причина состоит в том, что тип родительской модели является значением столбца, таким образом, его соответствующее имя таблицы не может быть вставлено ИЗ/СОЕДИНЕНИЕ пунктов того запроса. Имя таблицы является bankaccounts и кредитными картами, таким образом, это означает, что они должны быть исключительными? Также account_type является строкой или Bankaccount или Creditcard для отражения модели, но это должно быть имя таблицы вместо этого?

11
задан Jeff 1 September 2015 в 00:16
поделиться

1 ответ

Здесь есть две проблемы:

  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, если вы не планируете получать доступ к объединенным объектам после запроса.

19
ответ дан 3 December 2019 в 05:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: