2013-06-09 3 views
1

В приложении Rails 3.2 У меня есть модель User, которая имеет много наград.Как группировать по нескольким атрибутам на детей, а затем подсчитывать?

Класс премии имеет: тип,: уровень и: атрибуты изображения.

На странице просмотра пользователя я хочу показать свои награды, но с некоторыми критериями. User.awards должны быть сгруппированы как по типу, так и по уровню, и для каждой комбинации уровня типа я хочу отображать его изображение и подсчет наград.

Я изо всех сил пытаюсь построить запросы и взгляды, чтобы достичь этого (и объяснить это четко).

Как я могу группировать по двум атрибутам дочерней записи, а затем отображать как счетчик, так и атрибут (например, изображение) этих детей?

ответ

0

В зависимости от базы данных, которую вы используете вы должны создать запрос пользовательской SQL с помощью GROUP BY от типа и уровня:

SELECT * FROM users GROUP BY users.type, users.level 

(Postgres имеет специальную интерпретацию GROUP BY поэтому проверить документ из базу данных, которую вы используете).

Чтобы записать его в Rails читать документацию: http://guides.rubyonrails.org/active_record_querying.html#group

Для подсчета вам придется сделать это на втором этапе (Ruby может сделать это с помощью метода size на массив ActiveRecord объекта запроса будет верните вас).

0

Мне потребовалось некоторое время, чтобы понять это из-за сложного сочетания активных объектов записи, массивов и сгруппированных массивов.

Во всяком случае, упаковывают это полезно для тех, кто еще

Учитывая Пользователь имеет много наград и премии имеет атрибуты :type, :level, :image.

for award in @user.awards.group_by{ |award| [award.type,award.level] }.sort_by{|award| [award[0][0], award[0][1]]} 
    puts "#{(award[0][0]).capitalize} - Level #{award[0][1]}" # e.g. Award_Name - Level 1 
    puts award[1].first.image #outputs the value of award.image, i.e. the image url 
    puts award[1].count #counts the number of grouped awards 
end 

Немного странно! Может быть, есть способы оптимизировать этот код?

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