2016-10-02 5 views
2

So bin ich verwirrt darüber, wie ActiveRecord dies behandelt, und hoffte, jemand könnte mir einen Einblick geben.Polymorphe Beziehung Verwirrung

Ich habe eine Tabelle, die eine polymorphe Beziehung hat. Wir werden es Tabellenauswahl nennen. Dort habe ich definiert:

belongs_to :chooseable, polymorphic: true 

Ich habe zwei Modelle, lassen Sie uns einen Film, und der andere spielt. Da drin, ich habe: has_many :choices as: chooseable, dependent: destroy

Im Modell mit der polymorphen Beziehung Ich habe zwei Bereiche:

scope :with_movies, -> { 
    includes(:movies) 
     .where("chooseable_type": "Measure") 
    } 
    scope :with_shows, -> { 
    includes(:shows) 
     .where(shows: { hidden: false }) 
    } 

Was ich ist verwirrend ist, wenn ich sage, users.choices.with_movies, und ich überlasse aus dem chooseable_type wo Zustand, AR bei mir stockt und sagt:

Unknown column 'choices.chooseable_type' in 'where clause': SELECT `movies`.* FROM `movies` WHERE `choices`.`chooseable_type` = 'Movie' AND `movies`.`id` IN (728) 

Doch in dem zweiten Umfang with_shows, brauche ich nicht chooseable_type definieren - es funktioniert gut. Noch verwirrender ist es, wenn ich die where-Klausel with_shows entferne, funktioniert das nicht so gut.

Ich verstehe wirklich nicht, warum die Where-Klausel im zweiten Bereich ermöglicht eine richtige Abfrage generiert werden, aber ohne sie fällt es auf sein Gesicht.

Antwort

0

Das Problem ist, dass Rails zu tun versucht, ist es am besten den Aufbau der resultierenden komplizierten Abfrage für Sie, und es löst

.where("chooseable_type": "Measure") 

es beste Vermutung ist, die die Haupttabelle für diese Abfrage ist. Hilfe es nicht scheitern, geben Sie den Tabellennamen explizit:

.where("movies.chooseable_type": "Measure") 
+0

Also, weil der andere Rahmen eine where-Klausel für die Shows Tabelle hat, weiß, dass es die chooseable_type Klausel auf die zeigt Tabelle anzuwenden, auch wenn dies nicht der Fall ausdrücklich sagen zu? Das ist mir so fremd. – Siraris

+0

Versuchen Sie, 'puts with_shows.to_sql' zu erstellen, um die Abfrage zu erstellen. – mudasobwa

Verwandte Themen