Rails enthält () LEFT OUTER JOIN mit der benutzerdefinierten ON-Klausel

8

In meinem Szenario habe ich ein BlogPost Modell das has_and_belongs_to_many :categories . Ich möchte out Blog-Posts filtern, die zu bestimmten Kategorien gehören, während immer noch nicht kategorisierte Blog-Posts möglich sind (daher die Notwendigkeit eines LINKEN OUTER-JOINS).

Ich habe erwartet, dass das funktioniert:

%Vor%

Aber es wird nicht richtig gefiltert, weil es die Bedingungen am Ende der Abfrage außerhalb des LEFT OUTER JOIN setzt (siehe diese SO Frage / Antwort für den Grund: SQL-Verknüpfung: where-Klausel vs. on-Klausel )

Das funktioniert, aber es ist hässlich:

%Vor%

Gibt es eine ActiveRecord-freundliche Möglichkeit, Bedingungen zu der ON-Klausel eines LEFT OUTER JOIN hinzuzufügen, ohne sie manuell einzugeben, wie ich es getan habe?

    
ncherro 14.02.2014, 18:07
quelle

2 Antworten

0

Ich denke, das könnte funktionieren.

%Vor%

und fügen Sie es zusammen mit einem Bereich hinzu, der alle Blogposts ohne Kategorie enthält. Ein weiterer Gedanke wäre, stattdessen eine has_many through -Beziehung zu verwenden und tatsächlich ein Modell für BlogPostCategory zu erstellen, da Sie dazwischenliegende Bereiche hinzufügen können.

    
Sean 14.02.2014 22:18
quelle
0

Ich bin mit der ActiveRecord-Syntax nicht vertraut, aber können Sie den Filter um Zeilen erweitern, in denen category_id IS NULL ? Das wird Ihre Anforderung erfüllen.

    
Martin Schapendonk 05.10.2015 11:53
quelle