2013-02-17 130 views
0

我提交的形式被保存多條記錄,而這些參數是這個樣子:映射,通過密鑰的散列/值

{ 
    "utf8"=>"✓", 
    "_method"=>"put", 
    "products"=> { 
    "321" => { 
     "sale_price"=>"10" 
    }, 
    "104" => { 
     "sale_price"=>"10" 
    } 
    } 
} 

然後在我的控制,我有這樣的:

@updated_products = Product.update(params[:products].keys, params[:products].values) 

這期望鍵(321,104)是ID。
但是,我在我的模型中使用to_param將我的網址從ID更改爲另一個列值。

有沒有辦法採取params[:products].keys和交換他們相應的ID,這樣我可以在.update()語句中使用的ID。 我可以使用Product.find_by_column_name(321).id來獲得id,但我不知道該怎麼做。仍然是新的鐵路。

任何幫助,將不勝感激。謝謝。

回答

1

看源代碼here#update遍歷每個密鑰並運行update_attributes所以它經過所有的驗證。您可以將方法更改爲

@updated_products = params[:products].inject([]) do |array, (column_id, attributes)| 
    product = Product.find_by_column_id column_id 
    if product.update_attributes(attributes) 
    array << product 
    else 
    array 
    end 
end 

這可能看起來有點複雜,但它等於下面這一個是容易理解和閱讀代碼

@updated_products = [] 

params[:products].each do |column_id, attributes| 
    product = Product.find_by_column_id column_id 
    if product.update_attributes(attributes) 
    @updated_products << product 
    end 
end 
+0

你的代碼的第二塊的工作。第一個沒有,不知道爲什麼。 – 2013-02-18 14:33:54