【问题标题】:Create or Update Multiple Records at a Single Time Using Strong Parameters in Rails 4在 Rails 4 中使用强参数一次创建或更新多条记录
【发布时间】:2013-11-08 19:07:40
【问题描述】:

我有两个问题:


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

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

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

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

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

谢谢。

【问题讨论】:

  • 我认为您对 strong params 的设计用途感到困惑 - 它们基本上只是用于“白名单”不同的参数,以便您可以在控制器中调用它们。它相当于 Rails 3 中的attr_accessible

标签: ruby-on-rails multiple-instances strong-parameters


【解决方案1】:

也许您正在考虑使用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

【讨论】:

    【解决方案2】:

    无accepted_nested_attributes_for的解决方案

    这是我关于 SO 的第二个答案,但我多次遇到这个问题,在撰写本文时无法找到合理的解决方案,并在做了一些嵌套属性假设后终于自己想出来了,并想分享我最好的对它的理解。我相信你所追求的强大的参数线是这样的:

    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 项目中测试了它,它就像一个魅力。至于创建多个:How would I save multiple records at once in Rails?

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-13
      • 2011-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多