2017-06-07 15 views
1
、私は次のモデルを持っている

イーガーロードポリモーフィック団体

class Conversation < ActiveRecord::Base 
    belongs_to :sender, foreign_key: :sender_id, polymorphic: true 
    belongs_to :receiver, foreign_key: :receiver_id, polymorphic: true 

class Owner < ActiveRecord::Base 

class Provider < ActiveRecord::Base 

class Account < ActiveRecord::Base 
    has_one :provider, dependent: :destroy 
    has_many :owners, dependent: :destroy 

会話では、senderはオーナーまたはプロバイダーになることができます。意図したとおり、この作品

Conversation.includes(sender: :account).limit 5 

:このことを念頭に、私は次のようにクエリを行うことができます。問題は、関連付けられたモデルアカウントでwhere句を使用する場合です。アカウントの国が米国である会話をフィルタしたいこのような何か:

Conversation.includes(sender: :account).where('accounts.country' => 'US').limit 5 

しかし、この文句を言わない仕事、私はエラーActiveRecord::EagerLoadPolymorphicError: Cannot eagerly load the polymorphic association :sender

クエリのこの種を行うための正しい方法は何ですか取得しますか?

私もjoinsを使用しようとしましたが、同じエラーが発生します。

+0

「Conversation.preload ...」を試しましたか? –

+0

はい、同じエラーが発生します。 –

答えて

1

他の誰かが興味を持っている場合に備えて、私自身が解決策を見つけました。私はjoinsをSQLクエリで使用して終了しました。

Conversation.joins("LEFT JOIN owners ON owners.id = conversations.sender_id AND conversations.sender_type = 'Owner' 
        LEFT JOIN providers ON providers.id = conversations.sender_id AND conversations.sender_type = 'Provider' 
        LEFT JOIN accounts ON accounts.id = owners.account_id OR accounts.id = providers.account_id"). 
       where('accounts.country' => 'US').limit 5