在使用 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 作为警告