2012-04-05 6 views
0

Mein Rabattmodell hat eine Periodenzuordnung. Ich versuche, einen Bereich zu schreiben, der Rabatte ab heute beginnt, einschließlich:Auswählen einer anderen Bedingung basierend auf dem Vorhandensein einer Assoziation?

  1. wenn es einen Punkt hat, wählen Sie die Perioden, die heute beginnt.
  2. , wenn es keine Zeit haben, wählen Sie diese Rabatte, die
  3. zwischen gestern und heute erstellt wurden

Meine aktuelle Abfrage kann die erste Anforderung tun (eigentlich ein bisschen komplexer als diese):

def self.begins_today 
    joins(:event).where("begin = ?", today) 
end 

Wie kann ich jedoch Anforderung 2 erreichen?

Ich dachte über die Verwendung von SQL UNION-Befehl, aber ich denke, es kann nicht als ein Bereich arbeiten.

Antwort

1

Ich nehme an, dass Ereignis die Periodenassoziation enthält?

In jedem Fall möchten Sie einen linken Join zwischen der Tabelle Rabatte und der Tabelle Perioden. Dadurch erhalten Sie die Periodendaten für die begin = today where-Klausel und null, wenn keine Periode vorhanden ist. So ist die SQL, die Daten wählen würde

sein
SELECT [columns] 
FROM discounts_table 
LEFT JOIN periods_table ON periods_table.discount_id = discounts_table.id 
WHERE (periods_table.begin = [today]) OR (periods_table.begin IS NULL AND discounts_table.created_at BETWEEN [yesterday] AND [today]) 

in Schienen sollten Sie in der Lage sein, dies zu erreichen, wie folgt:

Discount 
    .joins("LEFT JOIN periods_table ON periods_table.discount_id = discounts_table.id") 
    .where("(periods_table.begin = ?) OR (periods_table.begin IS NULL AND discounts_table.created_at BETWEEN ? AND ?)", today, today, 1.day.ago.to_date) 

Leider müssen Sie die Verwendung von SQL-Anweisungen, anstatt Schienen schaffen es für Sie im Stich gelassen wie:

  1. mit einem Symbol verbindet schafft nur ein INNER JOIN, keine LEFT JOIN
  2. wo mit Symbolen usw. kombinieren Hashes c Zusätze mit UND, nicht ODER
+0

danke, es funktioniert. Eine Sache, die ich bemerkte, ist, dass es ziemlich langsam ist (4000 Rabatte/8000 Perioden, beide mit Index). Ich denke, es wird in Ordnung sein, wenn ich andere Bereiche mische. – lulalala

Verwandte Themen