通过键/值的散列进行映射

时间:2013-02-17 22:58:34

标签: ruby-on-rails ruby ruby-on-rails-3

我有一个提交的表单正在保存多个记录,参数看起来像这样:

{
  "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 个答案:

答案 0 :(得分: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