2017-11-16 5 views
0

Lasst uns sagen, dass ich diese Beziehung haben:Rails umfasst mit mehreren Bedingungen

Users has_many Orders, Visits 

Für jeden Benutzer, ich möchte ein Objekt komponieren wie so:

{Name: user.name, Orders: user.orders, Visits: user.visits} 

Und ich möchte Besuche beschränken zu denjenigen, die im letzten Jahr vorkamen, und Ordnungen zu denjenigen, die im letzten Monat vorkamen. Im Moment bin ich versucht, diese Abfrage zu verwenden:

Users.includes(:Visits, :Orders).where('Visit.occurred_on > ?', 1.year.ago) 
           .where('Order.date > ?', 1.month.ago) 
           .references(:Visits, :Orders) 

Das Problem ist, diese gibt nur die Benutzer, wo beide, wo die Bedingungen erfüllt sind, weil die Bedingungen angewandt werden, nachdem die Outer-Joins. Gibt es eine Möglichkeit, nur die Datensätze aufzunehmen, nach denen ich suche?

+0

Es sind ein paar Probleme mit den Namenskonventionen verwendet, die Sie ausgeschaltet werden könnten werfen. Die Modellnamen sollten singulär sein (d. H. "Benutzer") und die Hash-Schlüssel in Kleinbuchstaben. Das 'includes' sollte dann von kleingeschriebenen, pluralisierten Symbolen sein. Schließlich sollten Ihre 'where' Klauseln den Namen der Datenbanktabelle in SQL enthalten - dies ist üblicherweise in Kleinbuchstaben, pluralisiert. Ich bin mir nicht sicher, ob das das Problem hier lösen wird - aber vielleicht einen Blick wert? – SRack

Antwort

0

Sie können Ihre Abfrage wie folgt ändern:

Users.includes(:Visits, :Orders).where('Visit.occurred_on > ? AND Order.date > ?', 1.year.ago, 1.month.ago) 

Lassen Sie mich wissen, dass dies für Sie gearbeitet wird oder nicht.

Hinweis: Abfrage hat

nicht getestet
+0

Das ist eine bessere Möglichkeit, die Abfrage zu schreiben. Leider ändert sich das Ergebnis nicht. Es führt immer noch die Include-Joins aus und wendet dann die WHERE-Bedingungen an. – BTBrew