DataMapper first_or_create всегда устанавливать определенное поле? - PullRequest
1 голос
/ 28 июня 2011

Я использую следующее с datamapper для создания / получения нового пользователя из моей базы данных:

user = User.first_or_create({:id => data['id']})

Это получает пользователя с id = data ['id'] или создает его, если нене существует.

Я хочу знать, как установить другие атрибуты / поля возвращаемого объекта независимо от того, является ли он новой записью или существующим?

Это единственный способ сделать этозатем позвонить user.update({:field => value ...}) или есть лучший способ добиться этого?

Ответы [ 2 ]

2 голосов
/ 14 июля 2011

Ну, вы можете написать это одной строкой:

(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).

0 голосов
/ 04 июля 2016

Просто для всех, кто сталкивался с этим ответом, User.first_or_create ({: id => data ['id']}) НЕ "получает пользователя с id = data ['id'] или создает его, если он не ' т уже существует. " Фактически он получает первую запись в таблице и меняет свой идентификатор t0 data ['id'].

Чтобы получить первую запись с этим идентификатором или создать ее, если она не существует, вам нужно использовать выражение where:

User.where(id: data['id]).first_or_create
...