我正在使用以下datamapper从我的db创建/获取新用户:
user = User.first_or_create({:id => data['id']})
这会让用户获得id = data ['id'],或者如果它尚不存在则创建它。
我想知道如何设置返回对象的其他属性/字段,无论它是新记录还是现有记录?
这是唯一的方法,然后拨打user.update({:field => value ...})
或者有更好的方法来实现这一目标吗?
答案 0 :(得分:2)
好吧,你可以把它写成一行:
(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中有效)。
答案 1 :(得分:0)
对于遇到此答案的任何人,User.first_or_create({:id => data [' id']})不会"获取id = data [&#的用户39; id']或创建它,如果它还没有存在。"它实际上获得了表格中的第一条记录并更改了其id t0数据[' id']。
要实际获取具有该ID的第一条记录,或者如果它不存在则创建它,则需要使用where子句:
User.where(id: data['id]).first_or_create