2013-02-17 174 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