我正在使用以下数据映射器从我的数据库中创建/获取新用户:
user = User.first_or_create({:id => data['id']})
这将获取 id = data['id'] 的用户,或者如果它不存在则创建它。
我想知道如何设置返回对象的其他属性/字段,无论它是新记录还是现有记录?
是这样做的唯一方法然后调用user.update({:field => value ...})
还是有更好的方法来实现这一点?
我正在使用以下数据映射器从我的数据库中创建/获取新用户:
user = User.first_or_create({:id => data['id']})
这将获取 id = data['id'] 的用户,或者如果它不存在则创建它。
我想知道如何设置返回对象的其他属性/字段,无论它是新记录还是现有记录?
是这样做的唯一方法然后调用user.update({:field => value ...})
还是有更好的方法来实现这一点?
好吧,你可以把它写成一行:
(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
with an:id
将尝试使用该特定创建模型。:id
这可能不是你想要的。
或者,您可以使用first_or_new
. 但是,您不能调用update
使用它创建的对象,因为该记录不存在(尽管我相信这可能在以前版本的 DataMapper 中有效)。
只是对于遇到此答案的任何人, User.first_or_create({:id => data['id']}) 不会“使用 id = data['id'] 获取用户或在它尚不存在时创建它。” 它实际上获取了表中的第一条记录并更改了它的 id t0 data['id']。
要实际获取具有该 id 的第一条记录,或者如果它不存在则创建它,您需要使用 where 子句:
User.where(id: data['id]).first_or_create