Ist es in Rails> 3.2 möglich, Bedingungen zu der Join-Anweisung hinzuzufügen, die von der includes
-Methode generiert wird?Schienen enthält mit Bedingungen
Sagen wir, ich habe zwei Modelle, Person und Note. Jede Person hat viele Notizen und jede Notiz gehört einer Person. Jede Notiz hat ein Attribut important
.
Ich möchte alle Leute finden, die nur die wichtigen Notizen vorladen. In SQL das sein wird:
SELECT *
FROM people
LEFT JOIN notes ON notes.person_id = people.id AND notes.important = 't'
In Rails, die nur ähnliche Weise zu tun, ist mit includes
(Anmerkung: joins
nicht Noten Vorspannung) wie folgt aus:
Person.includes(:notes).where(:important, true)
jedoch, dass Wille erzeugen die folgende SQL-Abfrage, die ein anderes Ergebnis zurückgibt:
SELECT *
FROM people
LEFT JOIN notes ON notes.person_id = people.id
WHERE notes.important = 't'
Bitte beachten Sie, dass die erste resultset beinhaltet alle Menschen und die zweite nur die Menschen, mit wichtigen Notizen verbunden.
Beachten Sie auch, dass Bedingungen seit 3.1 veraltet sind.
Ist Gibt es einen Unterschied in der Leistung? notes.important = 't' in einer Join-Klausel ist nicht semantisch, da sie nur ein Modell berücksichtigt. – fotanus
Ja. Es ist eine Frage der Leistung. Ich brauche alle Leute, eifrig wichtige Notizen, wenn es welche gibt. – gusa
Ich stehe vor der gleichen Frage, wie Sie Ihre Abfrage schließlich verwaltet haben? Hast du es in reinem SQL geschrieben? –