2017-06-07 6 views
1

ich folgende Modelle haben:Eager Last polymorphe Verbände

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 

So in einem Gespräch, sender kann ein Eigentümer oder ein Provider sein. In diesem Sinne kann ich Abfragen machen wie:

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

Dies funktioniert wie vorgesehen. Das Problem ist, wenn ich eine Where-Klausel im zugehörigen Modell Account verwenden möchte. Ich möchte Gespräche filtern, deren Land "US" ist. Etwas wie folgt aus:

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

Aber das wird nicht funktionieren, erhalte ich die Fehler ActiveRecord::EagerLoadPolymorphicError: Cannot eagerly load the polymorphic association :sender

Was ist der richtige Weg, um diese Art von Abfrage zu tun?

Ich habe auch versucht, joins zu verwenden, aber ich bekomme den gleichen Fehler.

+0

versuchte 'Conversation.preload ...'? –

+0

Ja, gibt den gleichen Fehler. –

Antwort

1

Ich habe eine Lösung gefunden, falls jemand anderes interessiert ist. Ich endete mit joins mit einer SQL-Abfrage:

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