2009-03-16 14 views
10

Mam listę obiektów "żądań", z których każda ma dość normalne właściwości aktywnego rekordu. Tabela żądań jest powiązana z tabelą gier z tabelą łączenia, "games_requests", więc żądanie ma tablicę request.games.Szyny: Jak znaleźć() wszystkie rekordy unikatowe w niektórych polach?

Pytanie brzmi, czy istnieje sposób na znalezienie znaleziska dla ostatnich n unikatowych żądań, gdzie unikalność jest definiowana przez kolumnę gier i kilka innych, ale w szczególności ignoruje inne kolumny (takie jak nazwa żądającego użytkownika?)

Widziałem składnię typu "find (: all,: limit => 5,: include => [: games,: stage])", ale to zwracało duplikaty.

Dzięki ...

EDIT: Dzięki chaosu na wielkie odpowiedzi. Bardzo mnie to zbliżyło, ale nadal potrzebuję, aby zwracane obiekty były prawidłowymi obiektami żądania: pierwszych 5 rekordów, które są odrębne w żądanych wierszach. Mogę po prostu użyć znaleziska podczas jego tworzenia, a następnie zrobić drugie znalezisko dla pierwszego wiersza w tabeli, który pasuje do każdego zestawu zwróconego przez pierwsze znalezisko.

EDIT:

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

... daje błąd SQL:

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

Zrobiłem kilka zmian do tego, co przyjmuje się za prawidłowe dla mojego projektu; uzyskanie listy zgłoszeń zamiast gier, itp .:

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

Myślę, że będę musiał użyć opcji: join => tutaj.

Odpowiedz

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

to powrót gry, cokolwiek i whatever_else kolumn. Czy istnieje sposób zwracania kompletnych obiektów żądań, wysuwając tylko te, które nie spełniają wyjątkowości w tych kolumnach? – Sniggerfardimungus

+0

Tak. Edytowano za. – chaos

+0

Hrm. Występuje problem z "grami" będącymi atrybutem wirtualnym za pośrednictwem tabeli dołączania. (patrz edytowane pytanie) – Sniggerfardimungus

0

myślę, że można to zrobić przy użyciu find_by_sql i GROUP BY:

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

Spróbuj Rails uniq_by.It współpracuje również z stowarzyszenia i zwraca tablicę.

@document = Model.uniq_by(&:field)

Więcej Detail

+2

Pomyśl, że 'uniq_by' jest zamortyzowane i zastąpione przez' uniq'. – Cimm

Powiązane problemy