Как найти () все записи уникальные в определенных полях? - PullRequest
10 голосов
/ 16 марта 2009

У меня есть список объектов 'request', каждый из которых имеет довольно нормальные качества activerecord. Таблица запросов связана с таблицей игр с таблицей соединений 'games_requests', так что запрос имеет массив request.games.

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

Я видел синтаксис вроде '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'
)

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

Ответы [ 3 ]

9 голосов
/ 16 марта 2009
Games.find(
    :all, :limit => 5,
    :include => [:games, :requests],
    :group => 'games, whatever, whatever_else'
)
6 голосов
/ 11 октября 2013

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

@document = Model.uniq_by(&:field)

Подробнее Подробнее

0 голосов
/ 16 марта 2009

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

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