2011-05-11 3 views
2

Isbn, Sale 및 Channel의 세 가지 모델이 있습니다.레일 3 : 배열 메서드의 변수로 배열의 내용을 사용합니다.

목표는 :

ISBN :하여 myISBN을위한하여 myISBN

총 매출 : 채널 100 개

하여 myISBN 판매 같은 것을 보이는 ISBN이 show.html.erb보기 목록을 얻을 수 있습니다 25

,745,151 : 채널 3에 대한 25

하여 myISBN 판매 : 1 : 2 채널 50 개

하여 myISBN 판매

여기 내 모델입니다. 내가에서 일한지

belongs_to :sale 

: Isbn.rb 모델

has_many :sales 
has_many :channels, :through => :sales 

Sale.rb 모델은

has_many :channels 
belongs_to :isbn 

Channel.rb 모델 (속성, isbn_id, 수량 sales_channel_id있다) show 메서드에서 isbns 컨트롤러를 사용하면 작업 할 수 있습니다. 나중에 리팩토링을 할 수있을 것이라고 생각했습니다.이 모든 것들이 모델에 포함되어야하는지에 대한 조언은 가장 환영받을 것입니다. 성공적으로

@channelisbn = Sale.where("sales_channel_id =?',1).where("isbn_id=?",3) 
@channelsalesisbn = 0 
@channelisbn.each {|y| @channelsalesisbn =+ y.quantity} 

이 채널 ID가 1 인 모든 판매를 얻고 ISBN ID는 3입니다 그러나 ID가 하드 코딩으로는 많이 사용되지이다 :

지금까지 나는이 있어요. ,

@channellist = Channel.all 
@channel = 0 
@channelarray = @channellist.map {|z| @channel = z.id} 

나에게 [1,2,3,4]

의 사랑스러운 배열을 제공하지만 1을 전달하는 방법을 알아낼 수 없습니다 : 그래서 나는 배열에 채널 ID를 가지고 그 다음 2, 3, 4를 블록으로 묶어 판매 채널 ID가있는 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 

: - (나는 한 번에 하나의 문제를 해결할 줄 알았는데 여전히 ISBN ID를 하드 코딩)는 하늘의 배열을 돌려, 이것은 내가 뭘하려합니다.

도움을 주시면 감사하겠습니다. 이것은 내 첫 번째 게시물이므로 제로 수용률이 곧 바뀔 것입니다! 배열, 잘 그룹화 채널에 의해 ISBN에 의해 ​​저에게 판매를주는 :

UPDATE 그냥 여기 내가 좋은이다, 결국, 및 땜질 준비했습니다 어디, 오프이 질문을 마칩니다. 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)} 

은, 줄 바꿈은 명확성을 위해 추가 : 콘솔에서 당신이보기에서 PARAMS을 통과 할 수 없기 때문에

이 (저변에서, 모든 = 3 첫 @isbn 설정 때문에 @isbn가 제어기 정의 인스턴스 2

하행 콘솔에 닐)

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 이고, I는 생성 된 해시 키 값 (PA)을 가지고 잘못된 방향으로 돌아 간다. 판매 데이터를 포함하는 배열이 핵심이었습니다. 그것은 값이었을 것입니다.

@salesbychannel = @salesbychannelwrong.invert 

invert 방법은 키 - 값 쌍을 전환 : Rubydocs 하루 저장. 단. 어디(),이 같은 ARel 번호에 배열을 전달하고 찾고있는 무엇

답변

1

는 :

Sale.where(:sales_channel_id => @channelarray) 

이는 IN 쿼리를 실행해야합니다. ,

Sale.find(@channelarray) 

희망이

+0

안녕 Srdjan하는 데 도움이 도와 주셔서 너무 감사합니다 : 그것은 작동하지 않는 경우, 당신은 항상 다음과 같이 액티브 번호 찾기에 배열을 전달할 수 있습니다. 채널 배열에 * 모든 * 채널 ID가 포함되어 있으므로 판매가 * 모든 * 판매를 포함하는 배열을 반환하므로 내 생각을 분명히했습니다. 내가 필요로하는 것은 한 번에 하나씩 채널 ID를 전달할 수 있고, isbn/채널 당 한 세트의 데이터를 가져올 수 있어야합니다. 아마도 처음부터 채널 ID 배열을 만드는 아이디어를 다시 생각해 볼 필요가있을 것입니다. – snowangel

+0

@snowangel, 더 자세히 읽고, 나는 이것이 더 복잡한 문제라는 것을 알고 있습니다. 필요한 것은 집계를위한 ARel # 그룹입니다. 또한 Enumerable # 맵을 사용하는 대신 Channel.select (: id) .all –

+0

우, 크래킹을 수행하여 채널 모델에서 ID를 선택할 수 있습니다. 정말 고마워! 내가 충분한 명성을 얻었을 때, 내가 너를 지켜줄거야. 매우 감사. – snowangel

관련 문제