6

我有两个问题:


在 Rails 3 中,您可以使用更新多个记录

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

你如何在 Rails 4 中使用强参数做同样的事情?同时创建多条记录怎么样?您能否以如下格式举例说明您的解决方案:

params = ActionController::Parameters.new(...)
Product.create!(params.require(...)permit(...)

此外,我的产品模型有一个名为 number 的列,它等于它们更新的顺序。有没有办法在更新时将计数器值传递给数字?

谢谢。

4

2 回答 2

0

也许您正在考虑使用nested_attributes?看起来像这样:

params.require(:parent_model).permit(
  :id,
  child_models_attributes: [
    :id,
    :parent_model_id,
    :child_model_attribute_1,
    :child_model_attribute_2
  ]
)

params = {
  id: parent_model.id,
  child_models_attributes: {
    '0' => {
      id: child_model_1.id,
      parent_model_id: parent_model.id,
      child_model_attribute_1: 'value 1',
      child_model_attribute_2: 12312
    }
  }
}

您需要像这样为父模型允许nested_attributes:

class ChildModel < Activerecord::Base
  belongs_to :parent_model
end

class ParentModel < Activerecord::Base
  has_many :child_models
  accepts_nested_attributes_for :child_models
end
于 2015-02-19T13:31:11.990 回答
0

不带 Accept_nested_attributes_for 的解决方案

这是我在 SO 上的第二个答案,但我多次遇到这个问题,在撰写本文时无法找到合理的解决方案,并在做了一些nested_attributes 假设并想分享我对它的最佳理解后终于自己弄清楚了. 我相信你所追求的强大的参数线是这样的:

product_params = params.require(:products).permit(product_fields: [:value1, :value2, etc...])

我不确切知道您的表单是什么样的,但您需要有一个 fields_for 将参数嵌套在 product_fields(或 any_name)中:

form_for :products do |f|
  f.fields_for product_fields[] do |pf|
    pf.select :value1
    pf.select :value2
    ...
  end
end

这将允许 permit() 接受单个显式哈希

product_fields => {0 => {value1: 'value', value2: 'value'}}

而不是键/值对

0 => {value1: 'value', value2: 'value'}, 1 => {value1: 'value', value2: 'value'}, etc...

否则您必须单独命名:

.permit(0 => [value1: 'value', value2: 'value'], 1 => [...], 2 => [...], ad infinitum)

这允许您更新多个产品,而无需使用接受嵌套属性的父模型。我刚刚在我自己的 Rails 4.2 项目中测试了它,它就像一个魅力。至于创建多个:如何在 Rails 中一次保存多个记录?.

至于计数器,您可能需要单独迭代每个模型:

product_params[:product_fields].keys.each_index do |index|
  Product.create!(product_params.merge(counter: index))
end

想了这么久,你可能自己解决了这个问题。:-)

于 2016-02-22T23:16:26.310 回答