2009-03-16 7 views
10

J'ai une liste d'objets 'request', dont chacun a des qualités d'enregistrement actives normales. La table requests est liée à la table games avec une table de jointure, 'games_requests', de sorte qu'une requête a un tableau request.games. La question est, y at-il un moyen de trouver les n dernières requêtes uniques, où l'unicité est définie par la colonne des jeux et quelques autres, mais spécifiquement ignore les autres colonnes (comme le nom de l'utilisateur demandeur?Rails: Comment trouver() tous les enregistrements uniques dans certains champs?

J'ai vu une syntaxe comme 'find (: all,: limite => 5,: include => [: jeux,: stage])' mais cela renvoyait des doublons.

Merci ...

EDIT: Merci au chaos pour une grande réponse. Vous m'avez vraiment rapproché, mais j'ai toujours besoin que les retours soient des objets de requête valides: les 5 premiers enregistrements qui sont distincts dans les lignes demandées. Je pourrais juste utiliser la recherche comme vous l'avez construit et ensuite faire une deuxième recherche pour la première rangée dans la table qui correspond à chacun des ensembles retournés par la première découverte.

EDIT:

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

... donne une erreur SQL:

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

J'ai fait quelques changements pour ce que je supposais être correct pour mon projet; obtenir une liste des demandes au lieu de jeux, etc:

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' 
) 

Je pense que je vais devoir utiliser: join => option ici.

Répondre

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

Ce retourne les jeux, peu importe, et les colonnes whatever_else. Existe-t-il un moyen de renvoyer des objets de requête complets, en éjectant uniquement ceux qui échouent à l'unicité dans ces colonnes? – Sniggerfardimungus

+0

Oui. Edité par. – chaos

+0

Hrm. A un problème avec 'jeux' étant un attribut virtuel à travers une table de jointure. (voir la question éditée) – Sniggerfardimungus

0

Je pense que vous serez en mesure de le faire en utilisant find_by_sql et GROUP BY:

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

Essayez Rails uniq_by.It travaille aussi avec tableau d'association et les retours.

@document = Model.uniq_by(&:field)

Plus Detail

+2

Pense que 'uniq_by' est déprécié et remplacé par' uniq'. – Cimm

Questions connexes