2012-01-08 5 views
0

настоящее время у меня заказ и изображения модели, которая выглядит следующим образом:Объединить результаты ActiveRecord в Ruby,

class Order < ActiveRecord::Base 
    has_many :images 
end 

class Image < ActiveRecord::Base 
    belongs_to :order 
end 

Теперь я хотел бы сделать следующее:

<% @order.images.each do |image| %> 
    <%= image.format %> x 
    <%= image.amount %> 
    <%= number_to_currency(image.price) %><br/> 
<% end %> 

Это печатает это:

1x 30x30 € 1,00 
1x 12x12 € 2,10 
3x 30x30 € 3,00 
4x 12x12 € 8,40 

Я хотел бы объединить это по форме изображения и суммировать сумму и цену. Но я пробовал несколько методов, но никто не работает, потому что @ order.images - это не простой массив, а объект Image. Это то, что я хотел бы достичь:

5x 12x12 € 10,50  
4x 30x30 € 4,00 

ответ

1

Вы можете попробовать использовать group_by:

@order.images.group_by(&:format).each do |format, images| 
    <%= "#{images.length}x #{format} #{number_to_currency(images.sum(&:price))" %> 
end 

Если сделать трюк. images - это массив объектов с равными значениями format.

1

Вы можете использовать association extensions:

class Order < ActiveRecord::Base 
    has_many :images do 
    def by_format 
     select('sum(amount) as amount_sum, sum(price) as price_sum').group('format') 
    end 
    end 
end 

А потом, по мнению:

@order.images.by_format.each { |i| i.format,... i.amount_sum, ..., i.price_sum,... } 
+0

Не знал, что такой подход. Должен работать отлично, но я немного упростил свой вопрос, потому что поле цены не является полем базы данных, и поэтому это не сработает. Однако достаточно интересно для будущего. – Sweam

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