使用find_or_initialize_by后,我可以使用一行来填充/更新新记录,就像使用new()时一样吗?

时间:2016-06-27 14:03:50

标签: ruby-on-rails modalviewcontroller ruby-on-rails-4.1

我正在更改某些功能,因此,我想使用find_or_initialize_by替换new

我的模态有13列

modal = Modal.new(col1: col1, col2: col2..... col13: col13)

新代码是:

modal = Modal.find_or_initialize_by(col1: col1, col3: col3)

现在我需要填充或更新剩余的11列。

这可以在一条线上完成吗?我宁愿不写:

modal.col1 = col1
modal.col2 = col2
....
modal.col13 = col13

由于

1 个答案:

答案 0 :(得分:2)

您可以传递一个块以将属性设置为新记录。当您想要使用某些值创建它们并且不想覆盖现有记录时,这非常有用。

modal = Modal.find_or_initialize_by(col1: col1, col3: col3) do |record|
  record.col4 = col4
  record.col5 = col5
  # etc
end

您可以使用#attributes=

播放其语法
modal = Modal.find_or_initialize_by(col1: col1, col3: col3) { |r| r.attributes = { col4: col4, col5: col5 } }

请注意,#attributes=只会设置值,您必须手动保存。如果您使用.find_or_create_by而不是.find_or_initialize_by,则会在阻止执行后验证并保存新记录。

如果您想为记录设置属性,无论它是否是新的:

modal = Modal.find_or_initialize_by(col1: col1, col3: col3)
modal.attributes = { col4: col4, col5: col5 }

您也可以使用#update_attributes,但您的记录将被验证并保存。

modal = Modal.find_or_initialize_by(col1: col1, col3: col3)
modal.update_attributes(col4: col4, col5: col5)