2014-01-27 156 views
0

我試圖通過其屬性使用.where查找對象(Variant),如果沒有參數爲零,查詢將起作用,否則它不返回任何內容。這裏是我的代碼:。在查詢零屬性時返回nil

product.product_options.blank? ? options = [nil] : options = product.product_options 
product.product_sides.blank? ? sides = [nil] : sides = product.product_sides 
product.product_sizes.blank? ? sizes = [nil] : sizes = product.product_sizes 

valid_variants = [] 

sides.product(sizes, options).each do |side, size, option| 
    side.blank? ? side_id = nil : side_id = side.id 
    size.blank? ? size_id = nil : size_id = size.id 
    option.blank? ? option_id = nil : option_id = option.id 

    valid_variants << product.variants.where(product_size_id: size_id, product_side_id: side_id, product_option_id: option_id).first 
end 

在這種情況下product.variants不包含匹配側,大小和選擇IDS但valid_variants是空的變體。

這裏是product.variants的內容:

{"id"=>1, "product_side_id"=>nil, "product_size_id"=>1, "product_id"=>1, "created_at"=>Mon, 27 Jan 2014 16:28:46 UTC +00:00, "updated_at"=>Mon, 27 Jan 2014 16:28:46 UTC +00:00, "product_option_id"=>1} 
{"id"=>2, "product_side_id"=>nil, "product_size_id"=>1, "product_id"=>1, "created_at"=>Mon, 27 Jan 2014 16:28:46 UTC +00:00, "updated_at"=>Mon, 27 Jan 2014 16:28:46 UTC +00:00, "product_option_id"=>2} 
{"id"=>3, "product_side_id"=>nil, "product_size_id"=>2, "product_id"=>1, "created_at"=>Mon, 27 Jan 2014 16:28:46 UTC +00:00, "updated_at"=>Mon, 27 Jan 2014 16:28:46 UTC +00:00, "product_option_id"=>1} 
{"id"=>4, "product_side_id"=>nil, "product_size_id"=>2, "product_id"=>1, "created_at"=>Mon, 27 Jan 2014 16:28:46 UTC +00:00, "updated_at"=>Mon, 27 Jan 2014 16:28:46 UTC +00:00, "product_option_id"=>2} 

下面是使用product.variants.where當valid_variants的內容(product_size_id:size_id,product_side_id:side_id,product_option_id:option_id)。首先

[nil, nil] 

下面是使用product.variants.where當valid_variants的內容(product_size_id:size_id,product_side_id:side_id,product_option_id:option_id)

[#<ActiveRecord::AssociationRelation []>] 
+1

你檢查了生成的sql查詢嗎?看看它是否符合你想要的? – bjhaid

回答

0

您將在每次迭代中重置valid_variants陣列。移動循環valid_variants = []外:

valid_variants = [] 
sides.product(sizes, options).each do |side, size, option| 
    side_id = side.blank? ? nil : side.id 
    size_id = size.blank? ? nil : size.id 
    option_id = option.blank? ? nil : option.id 

    valid_variants << product.variants.where(product_size_id: size_id, product_side_id: side_id, product_option_id: option_id).first 
end 

更新您的side_idsize_idoption_id初始化。

+0

我已經將它移出每個塊,它仍然沒有返回。 – Jack