2015-07-02 3 views
1

У меня есть модель Обзор и модель Музыка. В опросе есть музыка и музыка, а также музыкальные обзоры.Rails ActiveRecord: group and order by count

Музыка имеет идентификатор и поле имени. Пользователь, который принимает опрос, должен выбирать между различными музыкальными инструментами.

Я хотел бы получить самую избранную музыку для группы опросов.

я закончил с чем-то вроде этого:

surveys.joins(:musics).group("musics.id").order("count(musics.id) desc") 

(обследования быть группой обследований для данной даты) Но это дает мне ошибку неоднозначной «created_at», поэтому для тестирования I использовали все таблицы Survey вместо группы из них:

Survey.joins(:musics).group("musics.id").order("count(musics.id) desc") 

Но теперь ошибка в том, что «surveys.id» должен появиться в GROUP BY оговорки или использоваться в агрегатной функции.

Что я делаю неправильно и как я могу получить результат, который я ищу?

+1

Будет ли это работать, чтобы поменять порядок соединения 'Music.joins (: опросы) .group ('music.id'). order ('count (music.id) desc') '? –

+0

@steveklein Да, я просто тестировал это, и он работает. Теперь мне нужно найти способ использовать группу опросов Surveys, а не всю таблицу. Любые идеи о том, как это сделать? –

+0

Вы просмотрели [Rails docs] (http://guides.rubyonrails.org/active_record_querying.html#joining-tables)? В главе 12 есть несколько примеров объединения, которые, похоже, будут работать для вас. Не уверен, что лучше, не зная больше. –

ответ

1

я в конечном итоге делает сферу на музыку, как залежах (исследования является группа обследования для данного диапазона времени):

scope :avrg, ->(surveys) { joins(:surveys).where("surveys_musics.survey_id in (?)", surveys).group("musics.id") 
    .order("count(surveys.id) desc").limit(1).first.name } 
0

похоже, что вы получаете неоднозначную ошибку created_at, поскольку запрос, который вы использовали для создания опросов, не указывал таблицу. Попробуйте изменить его на что-то вроде:

surveys = Survey.where("surveys.created_at > '#{your_datetime_variable}' ") 

затем сделать присоединиться

0

Вы должны попробовать это для достижения результата, как музыка и соответствующие их количества, так после того, что вы можете получить наиболее часто используемую музыку с помощью рельсов хэша-методы просто проверить свое имя столбца и имя реляционной таблицы:

result=Music.joins(:surveys).group("DATE(survey_musics.created_at),survey_musics.music_id").select("musics.name as name, count(*) as number_of_time_used") 

поиск макс используется имя музыки методов хэша-рубиновых

result.inject({}) { |hsh, r| hsh[r.name] = r.number_of_time_used; hsh }.max_by{|k,v| v} 

иначе вы использовали его как путем объединения:

Music.joins(:surveys).group("DATE(survey_musics.created_at),survey_musics.music_id").select("musics.name as name, count(*) as number_of_time_used").inject({}) { |hsh, r| hsh[r.name] = r.number_of_time_used; hsh }.max_by{|k,v| v} 

я думаю, что это может помочь вам.