Как мне найти () все записи, уникальные в определенных полях?
-
19-08-2019 - |
Вопрос
У меня есть список объектов 'request', каждый из которых обладает довольно нормальными качествами activerecord.Таблица запросов связана с таблицей games таблицей объединения 'games_requests', так что запрос содержит массив request.games.
Вопрос в том, есть ли способ выполнить поиск по последним n уникальным запросам, где уникальность определяется столбцом games и парой других, но специально игнорируются другие столбцы (например, имя запрашивающего пользователя?)
Я видел синтаксис типа 'find (:all, :limit=>5, :include=>[:games,:stage])', но это возвращало дубликаты.
Спасибо...
Редактировать:Спасибо хаосу за отличный отклик.Вы подвели меня очень близко, но мне все еще нужно, чтобы возвраты были действительными объектами запроса:первые 5 записей, которые отличаются в запрошенных строках.Я мог бы просто использовать поиск в том виде, в каком вы его создали, а затем выполнить второй поиск для первой строки в таблице, которая соответствует каждому из наборов, возвращенных первым поиском.
Редактировать:
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'
)
Я думаю, мне придется использовать здесь опцию :присоединиться=>.
Решение
Games.find(
:all, :limit => 5,
:include => [:games, :requests],
:group => 'games, whatever, whatever_else'
)
Другие советы
Попробуйте Rails uniq_by.Он также работает с ассоциацией и возвращает массив.
@document = Model.uniq_by(&:field)
Еще Деталь
Я думаю, вы сможете сделать это, используя find_by_sql и GROUP BY:
Games.find_by_sql("SELECT * FROM games GROUP BY user_id")