我正在更改某些功能,因此,我想使用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
由于
答案 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)