2009-03-16 7 views
10

Ich habe eine Liste von 'Anfrage'-Objekten, von denen jedes ziemlich normale Active-Record-Qualitäten hat. Die Anforderungs-Tabelle bezieht sich auf die Spieltabelle mit einer Join-Tabelle, "games_requests", so dass eine Anfrage ein request.games-Array hat.Rails: Wie finde ich() alle in bestimmten Feldern eindeutigen Datensätze?

Die Frage ist, gibt es eine Möglichkeit, eine Suche nach den letzten n eindeutigen Anforderungen zu finden, wobei die Eindeutigkeit durch die Spiele-Spalte und ein paar andere definiert wird, aber speziell andere Spalten ignoriert (wie der Name des anfordernden Benutzers?)

Ich sah eine Syntax wie 'find (: alle,: limit => 5,: include => [: Spiele,: stage])' aber das war Duplikate.

Dank ...

EDIT: Vielen Dank für eine große Resonanz auf das Chaos. Sie haben mich sehr nahe gebracht, aber ich brauche immer noch die Rückgabe als gültige Anfrageobjekte: die ersten 5 Datensätze, die in den angeforderten Zeilen unterschiedlich sind. Ich könnte den Fund einfach so verwenden, wie Sie ihn konstruiert haben, und dann einen zweiten Fund für die erste Zeile in der Tabelle durchführen, die mit jeder der vom ersten Fund zurückgegebenen Mengen übereinstimmt.

EDIT:

Games.find(
    :all, :limit => 5, 
    :include => [:games, :requests], 
    :group => 'games, whatever, whatever_else' 
) 

... gibt einen SQL-Fehler:

Mysql::Error: Unknown column 'games' in 'group statement': SELECT * FROM `games` GROUP BY games 

Ich habe ein paar Änderungen für das, was ich für mein Projekt als richtig angenommen;

Request.find(
    :all, :order=>"id DESC", :limit=>5, 
    :include=>[:games], #including requests here generates an sql error 
    :group=>'games, etc' #mysql error: games isn't an attribute of requests 
    :conditions=>'etc' 
) 

Ich denke, ich werde zu verwenden, haben die:: Werden Sie Mitglied => Option hier statt Spiele usw. eine Liste von Anfragen bekommen.

Antwort

8
Games.find(
    :all, :limit => 5, 
    :include => [:games, :requests], 
    :group => 'games, whatever, whatever_else' 
) 
+0

Dies gibt die Spiele, was auch immer, und whatever_else Spalten. Gibt es eine Möglichkeit, vollständige Anforderungsobjekte zurückzugeben und nur diejenigen auszuwerfen, bei denen die Eindeutigkeit in diesen Spalten nicht besteht? – Sniggerfardimungus

+0

Ja. Bearbeitet per. – chaos

+0

Hrm. Hat ein Problem damit, dass Spiele ein virtuelles Attribut über eine Join-Tabelle sind. (Siehe bearbeitete Frage) – Sniggerfardimungus

0

Ich glaube, Sie in der Lage sein, sich von diesem mit find_by_sql und GROUP zu tun:

Games.find_by_sql("SELECT * FROM games GROUP BY user_id") 
6

Versuchen Rails uniq_by.It auch mit Verein und kehrt Array funktioniert.

@document = Model.uniq_by(&:field)

Mehr Detail

+2

Think 'uniq_by' wird abgeschrieben und durch' uniq' ersetzt. – Cimm