У меня есть три модели: Isbn, Sale и Channel.
Цель: получить список в представлении isbns show.html.erb, который выглядит примерно так:
Isbn: myisbn
Общий объем продаж для myisbn: 100
Объем продаж Myisbn для канала 1: 50
Объем продаж Myisbn для канала 2: 25
Объем продаж Myisbn для канала 3:25
Вот мои модели.Модель Isbn.rb
has_many :sales
has_many :channels, :through => :sales
Модель Sale.rb (имеет атрибуты sales_channel_id, isbn_id, количество)
has_many :channels
belongs_to :isbn
Модель Channel.rb:
belongs_to :sale
IЯ работал в контроллере isbns, в методе show, чтобы заставить что-то работать.Я подумал, что рефакторинг позже - совет о том, должен ли какой-либо из этих компонентов идти в модели, был бы очень кстати.
Пока у меня есть это:
@channelisbn = Sale.where("sales_channel_id =?',1).where("isbn_id=?",3)
@channelsalesisbn = 0
@channelisbn.each {|y| @channelsalesisbn =+ y.quantity}
Это успешно получает все продажи, где идентификатор канала равен 1, а идентификатор ISBN равен 3. Но это не очень полезно, так как идентификаторыжестко закодировано.Итак, я получил идентификаторы каналов в массиве:
@channellist = Channel.all
@channel = 0
@channelarray = @channellist.map {|z| @channel = z.id}
, что дает мне прекрасный массив [1,2,3,4]
Но я не могу понять, какпередайте 1, затем 2, затем 3, а затем 4 в блок, который можно использовать для поиска продаж ISBN, имеющих этот идентификатор канала продаж.Это то, что я пытался (все еще жестко кодировать идентификатор ISBN - думал, что я буду решать одну проблему за раз), который возвращал пустой массив:
@channelarray.each do |channel|
@channelisbn = []
@channelisbn = Sale.where("sales_channel_id = ?", channel).where("isbn_id = ?",3)
@channelsalesisbn = 0
@result = []
@result << @channelisbn.each {|a| @channelsalesisbn =+ a.quantity}
end
Затем я собирался суммировать содержимое массива,
Любая помощь будет принята с благодарностью.Это мой первый пост, так что скоро мой нулевой коэффициент принятия изменится!
ОБНОВЛЕНИЕ
Просто, чтобы закончить этот вопрос, вот, где я закончил, который великолепен и готов к работе с: массивом, красиво сгруппированным,давая мне продажи по каналам.Спасибо за подсказку group_by!
#in the show action in the isbns controller:
@isbn = Isbn.find(params[:id])
@channelarray = Channel.select(:id).all
@channelarray.group_by {|i| Sale.where("channel_id = ?",i).where("isbn_id =?", @isbn)}
Из консоли добавлены разрывы строк для ясности:
(сначала незаметно установите @isbn = 3, так как в консоли вы можете 'передать параметры из представления, поэтому экземпляр @isbn, определенный в контроллере, равен nil в консоли)
ruby-1.9.2-p180 :067 > @channelarray.group_by {|i| Sale.where("channel_id = ?",i).where("isbn_id =?", @isbn)}
=> {[#<Sale id: 1, isbn_id: 3, quantity: 10000, value: 12000, currency: "GBP", total_quantity: nil, created_at: "2011-05-06 12:30:35", updated_at: "2011-05-07 17:43:13", customer: "Waterstone's", retail_price: nil, discount: nil, invoice_date: "2011-05-24">, #<Sale id: 2, isbn_id: 3, quantity: 1000, value: 500, currency: "GBP", total_quantity: nil, created_at: "2011-05-07 09:37:53", updated_at: "2011-05-07 19:14:52", customer: "Borders", retail_price: nil, discount: nil, invoice_date: "2011-02-05">]=>[#<Channel id: 1>],
[#<Sale id: 3, isbn_id: 3, quantity: 500, value: 1500, currency: "", total_quantity: nil, created_at: "2011-05-07 09:38:11", updated_at: "2011-05-07 19:15:07", customer: "Borders", retail_price: nil, discount: nil, invoice_date: "2011-12-05">, #<Sale id: 4, isbn_id: 3, quantity: 45, value: 300, currency: "", total_quantity: nil, created_at: "2011-05-07 09:38:38", updated_at: "2011-05-07 19:15:36", customer: "Borders", retail_price: nil, discount: nil, invoice_date: "2011-06-05">]=>[#<Channel id: 2>],
[]=>[#<Channel id: 3>],
[]=>[#<Channel id: 4>]}
UPDATE 2
Ха, хэш Iсгенерированный имел пары ключ-значение в неправильном направлении.Массив, содержащий данные о продажах, был ключевым - это должно было быть значение.Rubydocs сохранил день:
@salesbychannel = @salesbychannelwrong.invert
Метод invert
переключает пары ключ-значение.Милая.