Ruby on rails 在使用find_或_initialize_by之后,我是否可以像使用new()一样使用一行填充/更新新记录?
我正在更改某些功能,因此,我想使用Ruby on rails 在使用find_或_initialize_by之后,我是否可以像使用new()一样使用一行填充/更新新记录?,ruby-on-rails,modalviewcontroller,ruby-on-rails-4.1,Ruby On Rails,Modalviewcontroller,Ruby On Rails 4.1,我正在更改某些功能,因此,我想使用find\u或
find\u或
替换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
谢谢您可以传递一个块来设置新记录的属性。当您希望使用某些值创建它们,并且不希望覆盖现有记录时,这非常有用
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\u或\u create\u by
而不是。find\u或\u initialize\u 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)
谢谢你的帮助,看起来好多了!我不得不取消选择这个作为答案。只有在创建新记录时才会调用该块,因此它不会更新现有记录。噢!我不知道您需要为所有记录(新记录或现有记录)设置属性。我将编辑答案:)谢谢,太好了!