У меня есть список объектов «запрос», каждый из которых имеет вполне нормальные свойства 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 =>.

10
Sniggerfardimungus 16 Мар 2009 в 19:34

3 ответа

Лучший ответ
Games.find(
    :all, :limit => 5,
    :include => [:games, :requests],
    :group => 'games, whatever, whatever_else'
)
9
chaos 16 Мар 2009 в 20:30
Это возвращает столбцы games, something и Any_else. Есть ли способ вернуть полные объекты запроса, выбрасывая только те, которые не имеют уникальности в этих столбцах?
 – 
Sniggerfardimungus
16 Мар 2009 в 20:16
Грм. Имеет проблему с "играми", являющимися виртуальным атрибутом через объединяющую таблицу. (см. отредактированный вопрос)
 – 
Sniggerfardimungus
16 Мар 2009 в 21:16
Очень сложно написать что-то, что будет работать, не зная фактической структуры вашей таблицы. Возможно: group => 'games' должно быть: group => 'game_id', потому что это имя столбца в запросах?
 – 
chaos
16 Мар 2009 в 21:31
Ах да, у вас есть "многие ко многим". Да, вам понадобится: join spec, чтобы добавить свою таблицу games_requests, а затем сгруппировать ее по столбцу game_id.
 – 
chaos
16 Мар 2009 в 21:32

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

@document = Model.uniq_by(&:field)

Подробнее Подробности

6
James Chevalier 29 Апр 2014 в 05:59
2
Думаю, что uniq_by обесценивается и заменяется на uniq.
 – 
Cimm
14 Май 2014 в 12:05

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

Games.find_by_sql("SELECT * FROM games GROUP BY user_id")
0
Codebeef 16 Мар 2009 в 19:49