11
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のいずれかの文字列ですが、代わりにテーブル名にする必要がありますか?

4

3 に答える 3

19

ここには2つの問題があります。

  1. ポリモーフィックな関連付けを合計します。
  2. ポリモーフィックアソシエーションの条件。

これらのいずれかを実際に行うことはできません。したがって、次の2つのクエリを実行しても、同じエラーが発生するはずです。

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

必要な情報を実際に取得するには、可能な親のポリモーフィックな関連付けを明示的にリストする必要があります。これを行う1つの方法は、SQLとLEFT JOINSを使用するだけで、単一のクエリを使用できるようにすることです。Railsを使用すると、これは2つのクエリで実行できます。

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:クエリ後に結合されたオブジェクトにアクセスする予定がない場合は、:includeの代わりに:joinを使用することをお勧めします。

于 2010-08-22T20:18:33.877 に答える
2

ポリモーフィックアソシエーションの条件を照会しようとしていない場合でもこのエラーが発生したのは、ポリモーフィックアソシエーションがプリロードでのみサポートされている場合にincludesがeager_loadを呼び出すことを決定したためです。こちらのドキュメントにあります:http://api.rubyonrails.org/v5.1/classes/ActiveRecord/EagerLoadPolymorphicError.html

したがって、ポリモーフィックな関連付けには常にプリロードを使用する必要があります。

于 2017-10-19T20:49:49.013 に答える
0

パンの答えに加えて、それらを追加する代わりに結合を行うこともできます。1つのクエリのみを実行します

于 2014-12-17T13:03:15.373 に答える