Как мне объединить хеш при использовании first_or_create? - PullRequest
0 голосов
/ 25 июня 2018

У меня есть этот хеш, который создается динамически:

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}

Я понимаю, что если запись уже существует (возвращается через 'first'), она не будет обновлена ​​... хотя это было бы хорошим вариантом, и любые рекомендации по этому поводу приветствуются, но таблица была просто удалена и воссоздана,так что проблема не в этом.

Чего мне не хватает?

Я также попытался использовать to_sym, в результате чего:

additional_values = {:grouping_id=>1}

... на всякий случайбыла какая-то странность, о которой я не знал ... не имел значения

1 Ответ

0 голосов
/ 25 июня 2018

Проблема в том, что Hash#merge возвращает новый хеш, и тогда вы ничего не делаете с этим хешем, вы просто выбрасываете его. Я бы также предложил придерживаться методов ActiveRecord для обновления атрибутов, вместо того, чтобы пытаться манипулировать базовым хешем, например, используя assign_attributes или, если вы хотите сохранить запись update . Тем не менее, вы можете найти create_with, который можно использовать с find_or_create_by, полезный здесь:

model.create_with(additional_values).find_or_create_by(name: 'test')

Я не могу найти документацию, которая мне нравится (если она вообще есть) для first_or_create в последних версиях rails, но если вам нравится больше, чем find_or_create_by, то если мы посмотрим на документацию Rails 3 для first_or_create вы должны иметь возможность сделать без create_with:

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