Ну, вы можете написать это одной строкой:
(User.first_or_create(:id => data['id'])).update(:field => value)
с хэшами для параметров, если вы хотите (или если вам нужно указать более одного); однако стоит отметить, что это будет работать только в том случае, если модель, указанная в first_or_create
, действительна. Например, если бы :name
было обязательным полем, это не сработало бы:
(User.first_or_create({:id => data['id'], :name => "Morse"})).update(:name => "Lewis")
, поскольку создание в первой части не удастся.
Вы можете обойти это, указав параметры, необходимые для новой записи, например,
(User.first_or_create({:id => data['id'], :name => "Morse"}, {:name => "Lewis"})).update(:name => "Lewis")
но это необычайно больно и трудно читать.
Также обратите внимание, что использование first_or_create
с :id
попытается создать модель с этим конкретным :id
, если такой записи не существует. Это может быть не то, что вы хотите.
В качестве альтернативы вы можете использовать first_or_new
. Вы не можете вызвать update
для объекта, созданного с использованием этого, однако, поскольку запись не существует (хотя я считаю, что это могло работать в предыдущих версиях DataMapper).