2012-03-27 7 views
0

Ich habe eine Tabelle, die ich verwenden, um Artikel Preisänderung im Laufe der Zeit zu protokollieren. Ich versuche, eine Methode zu schreiben, die den gesamten Satz von Artikeln (ohne Duplikate) zusammen mit ihren neuesten Preisen ergreift.RoR Auswahl neuesten "distinct by column" Reihen

Das bedeutet, dass eine Zeile mit einer item_id von 2 mehrmals in meiner Tabelle erscheinen kann, und eine Zeile mit einer item_id von 3 kann mehrmals innerhalb der Tabelle usw. erscheinen, aber das Ergebnis sollte sie nur einmal mit einschließen ihr neuster Preis

Ich versuche, einen Weg zu finden (ohne Item.find_by_sql(), wenn möglich), um den gesamten Satz von Artikeln und ihre neuesten Preise zurückzugeben.

Zur Zeit habe ich folgende:

SELECT * FROM 
(SELECT * FROM item_logs 
ORDER BY created_at DESC) inner_table 
GROUP BY item_id 

Es funktioniert, aber es scheint falsch es so zu tun, ich denke, ich bin für eine elegantere Art und Weise suchen, dies zu tun, da die aktuelle Implementierung erfordert ich find_by_sql verwenden, die nicht sehr flexibel ist.

Antwort

0

nicht sicher, es ist besser, aber eine andere Möglichkeit wäre die Verwendung sein verbindet:

ItemLog.joins(
    'join (select item_id, max(created_at) as created_at from item_logs group by 1) 
    as i on i.item_id = item_logs.item_id and i.created_at = item_logs.created_at' 
) 

länger als Ihre find_by_sql Lösung, ein teureres Abfrage auf Ihrer Datenbank sein könnte, aber hält das Ergebnis als aktiven Datensatz Beziehung Sie können also andere Methoden verketten.

Verwandte Themen