使用"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或者,如果要保存记录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)

最新更新