2009-03-16 3 views
10

У меня есть список объектов «запрос», каждый из которых имеет довольно нормальные свойства activerecord. Таблица запросов связана с таблицей игр с таблицей соединений «games_requests», так что запрос имеет массив request.games.Rails: Как найти() все записи уникальные в определенных полях?

Вопрос в том, есть ли способ сделать поиск для последних n уникальных запросов, где уникальность определяется столбцом игр и несколькими другими, но в частности игнорирует другие колоны (например, имя запрашивающего пользователя?)

Я видел синтаксис как «find (: all,: limit => 5,: include => [: games,: stage])», но это возвращало дубликаты.

Благодаря ...

EDIT: Благодаря хаос для большого ответа. Вы меня очень близко закрыли, но мне все же нужны, чтобы возвращаемые значения были действительными объектами запроса: первые 5 записей, которые различаются в запрошенных строках. Я мог бы просто использовать find, как вы его построили, а затем сделать вторую находку для первой строки в таблице, которая соответствует каждому из наборов, возвращаемых первой находкой.

EDIT:

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

... выдает ошибку SQL:

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

Я сделал несколько изменений для того, что я предположил, чтобы быть правильным для моего проекта; получить список запросов вместо игр и т.д.:

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

Я думаю, что я собираюсь должен использовать: присоединиться => варианта здесь.

ответ

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

Это возвращает игры, что угодно, и whatever_else колонны. Есть ли способ вернуть объекты полного запроса, вытесняя только те, которые не соответствуют уникальности в этих столбцах? – Sniggerfardimungus

+0

Да. Отредактированный per. – chaos

+0

Hrm. Возникает проблема с «играми», являющимися виртуальным атрибутом через таблицу соединений. (см. отредактированный вопрос) – Sniggerfardimungus

0

Я думаю, что вы будете в состоянии сделать это, используя find_by_sql и GROUP BY:

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

Попробуйте Rails uniq_by.It также работает с ассоциацией и возвращает массив.

@document = Model.uniq_by(&:field)

Больше Detail

+2

Подумайте, что 'uniq_by' амортизируется и заменяется на' uniq'. – Cimm

Смежные вопросы