ruby - 使用'first_or_create'时我应该如何合并哈希
问题描述
我有这个哈希,它是动态构建的:
additional_values = {"grouping_id"=>1}
通过first_or_create创建后,我想将它与此记录对象合并:
result = model.where(name: 'test').first_or_create do |record|
# I'm trying to merge any record attributes that exist in my hash:
record.attributes.merge(additional_values)
# This works, but it sucks:
# record.grouping_id = data['grouping_id'] if model.name == 'Grouping'
end
#Not working:
#result.attributes>>{"id"=>1, "name"=>"Test", "grouping_id"=>nil}
我知道如果记录已经存在(通过“第一”返回),它将不会被更新......虽然这将是一个不错的选择并且欢迎任何建议,但该表只是被删除并重新创建,所以那不是问题。
我错过了什么?
我也尝试过使用to_sym
,结果是:
additional_values = {:grouping_id=>1}
...以防万一有一些我不知道的怪事...没有什么不同
解决方案
问题是Hash#merge
返回一个新的哈希,然后你没有对那个哈希做任何事情,你只是把它扔掉。我还建议坚持使用 ActiveRecord 方法来更新属性,而不是尝试操纵底层哈希,例如使用assign_attributes
or,如果你想保存记录update
。不过,您可能会发现create_with
可以与 一起使用的find_or_create_by
在这里很有用:
model.create_with(additional_values).find_or_create_by(name: 'test')
在最近的 Rails 版本中,我找不到任何我喜欢(如果有的话)的文档first_or_create
,但如果你喜欢的不仅仅是find_or_create_by
,那么如果我们查看Rails 3 文档first_or_create
,你应该可以不用create_with
:
model.where(name: 'test').first_or_create(additional_attributes)