Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在使用find_或_initialize_by之后,我是否可以像使用new()一样使用一行填充/更新新记录?_Ruby On Rails_Modalviewcontroller_Ruby On Rails 4.1 - Fatal编程技术网

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)

谢谢你的帮助,看起来好多了!我不得不取消选择这个作为答案。只有在创建新记录时才会调用该块,因此它不会更新现有记录。噢!我不知道您需要为所有记录(新记录或现有记录)设置属性。我将编辑答案:)谢谢,太好了!