2009-03-16 20 views
10

Tengo una lista de objetos 'de solicitud', cada uno de los cuales tiene cualidades activerecord bastante normales. La tabla de solicitudes está relacionada con la tabla de juegos con una tabla de combinación, 'games_requests', por lo que una solicitud tiene una matriz request.games.Rieles: ¿Cómo encuentro() todos los registros únicos en ciertos campos?

La pregunta es, ¿hay alguna manera de hacer un hallazgo para las últimas n solicitudes únicas, donde la singularidad está definida por la columna de juegos y un par de otras, pero específicamente ignora otras columnas (como el nombre del usuario solicitante?)

Vi una sintaxis como 'find (: all,: limit => 5,: include => [: games,: stage])' pero eso era devolver duplicados.

Gracias ...

EDIT: Gracias al caos de una gran respuesta. Me has acercado mucho, pero aún necesito que los devoluciones sean objetos de solicitud válidos: los primeros 5 registros que son distintos en las filas solicitadas. Podría usar el hallazgo como lo construiste y luego hacer un segundo hallazgo para la primera fila de la tabla que coincida con cada uno de los conjuntos devueltos por el primer hallazgo.

EDIT:

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

... da un error SQL:

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

hice algunos cambios para lo que supuse que es correcta para mi proyecto; obtener una lista de solicitudes en vez de juegos, 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' 
) 

Estoy pensando que voy a tener que utilizar: unirse => opción aquí.

Respuesta

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

Esto devuelve los juegos, lo que, whatever_else y columnas. ¿Hay alguna manera de devolver los objetos de solicitud completos, expulsando solo aquellos que fallan la exclusividad en estas columnas? – Sniggerfardimungus

+0

Sí. Editado por – chaos

+0

Hrm. Tiene un problema con 'juegos' como un atributo virtual a través de una tabla de unión. (Consulte la pregunta editada) – Sniggerfardimungus

0

creo que usted será capaz de hacer esto utilizando find_by_sql y GROUP BY:

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

Trate rieles uniq_by.It también trabaja con la asociación y vuelve matriz.

@document = Model.uniq_by(&:field)

Más Detail

+2

Piense que 'uniq_by' se deprecia y reemplaza por' uniq'. – Cimm

Cuestiones relacionadas