1

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

这是代码:

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

问题一:

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

问题2:

将固定属性添加到task不在的新属性中怎么样?jobtask

谢谢你的帮助!

4

2 回答 2

4

你可以这样做:

@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 在创建新记录时会忽略它;)

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

重构:

  • @jobplan.jobtasks应该已经返回Jobtask属于 this 的对象Jobplan,因此无需再次查询数据库以再次找到它
  • 您的共享变量 like@task将在数组的每个循环中重写,最终创建一个共享变量@tasks并用创建的任务填充它。
于 2013-11-12T20:43:00.333 回答
3

问题一:

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

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

问题2:

Task.create(@jobtask.attributes.merge(:attribute_name => "value"))
于 2013-11-12T20:39:47.897 回答