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

Posted

技术标签:

【中文标题】在使用 find_or_initialize_by 后,我可以像使用 new() 时那样填充/更新一条新记录吗?【英文标题】:Can I Populate / update a new record after using find_or_initialize_by with one line like when using new()? 【发布时间】:2016-06-27 14:03:49 【问题描述】:

我正在更改某些功能,因此我想使用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】:

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

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)

【讨论】:

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

以上是关于在使用 find_or_initialize_by 后,我可以像使用 new() 时那样填充/更新一条新记录吗?的主要内容,如果未能解决你的问题,请参考以下文章

在哪里使用 CORBA 以及在哪里使用 SNMP 进行监控?

为啥在使用 unicode 时我不能在 :before :after 内容之后使用空格

在哪里使用 callable 以及在哪里使用 Runnable Interface?

在 Observable RxSwift 中使用 'asPromise()' 可以在 PromiseKit Promise 中使用吗?

可以在 SELECT 查询中使用 IF() 但不能在 UPDATE 中使用

使用 React,在使用 react-transition-group 时,在 StrictMode 中不推荐使用 findDOMNode 作为警告