使用“ first_or_create”时应如何合并哈希

时间:2018-06-25 16:52:04

标签: ruby ruby-on-rails-4 activerecord

我有这个哈希,它是动态构建的:

select t.*,
       max(SafetyEvent) over (partition by shop order by date rows between 31 preceding and current row) as SafetyEvent8Hours
from t

创建后,我想通过first_or_create将其与该记录对象合并:

return (make_response("", 200), listener())

我知道,如果记录已经存在(通过“ first”返回),则不会进行更新...尽管这是一个不错的选择,并且欢迎提出任何建议,但该表已被删除并重新创建,所以这不是问题。

我想念什么?

我还尝试使用additional_values = {"grouping_id"=>1} ,结果是:

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}

...以防万一我不知道有什么古怪...没什么不同

1 个答案:

答案 0 :(得分:3)

问题是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,那么我们看看{{ 3}},您应该可以不用create_with

model.where(name: 'test').first_or_create(additional_attributes)