Rails 3: использование содержимого массива в качестве переменных в методе where - PullRequest
2 голосов
/ 11 мая 2011

У меня есть три модели: 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 переключает пары ключ-значение.Милая.

1 Ответ

1 голос
/ 11 мая 2011

Что вам нужно, так это передать массив в ARel # where (), например так:

Sale.where(:sales_channel_id => @channelarray)

Это должно выполнить запрос IN.Если это не работает, вы всегда можете передать массив в ActiveRecord # find, например так:

Sale.find(@channelarray)

Надеюсь, это поможет

...