Rails在创建复制记录时排除属性

时间:2013-11-12 20:29:19

标签: ruby-on-rails

我的jobplan控制器中有代码。它正在创建jobtasks

的副本

这是代码:

@jobplan.jobtasks.each do |jobtask|
  @jobtask = Jobtask.where("id = ?", jobtask)
  @task = Task.create(@jobtask.attributes)
end

问题1:

有没有办法从新jobtask中排除task属性?

问题2:

如何为task

以外的新jobtask添加固定属性呢?

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

问题1:

@jobtask.attributes返回哈希值。所以你可以在哈希上做你能做的一切

Task.create(@jobtask.attributes.except(:attribute_name))

问题2:

Task.create(@jobtask.attributes.merge(:attribute_name => "value"))

答案 1 :(得分:2)

你可以这样做:

@jobplan.jobtasks.each do |jobtask|
  jobtask_attrs = jobtask.attributes
  jobtask_attrs.delete(:some_attribute) # Question 1
  jobtask_attrs.merge!({ additionnal_attribute: "Hello world!" }) # Question 2
  Task.create(jobtask_attrs)
end

注意:如果您想要取消属性的​​id属性,请不要担心,ActiveRecord会在创建新记录时忽略它;)< / p>

我重构了您的代码以提高效率/可读性,如果您需要,可随意提问; - )

重构:

  • @jobplan.jobtasks应该已经返回属于此Jobtask的{​​{1}}对象,因此无需再向DB发送查询以便再次找回它
  • 您的共享变量(如Jobplan)将在数组的每个循环中重写,最终创建一个共享变量@task并用创建的任务填充它。