DataMapper first_or_create总是设置某个字段?

时间:2011-06-28 16:25:25

标签: ruby orm sinatra ruby-datamapper

我正在使用以下datamapper从我的db创建/获取新用户:

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

这会让用户获得id = data ['id'],或者如果它尚不存在则创建它。

我想知道如何设置返回对象的其他属性/字段,无论它是新记录还是现有记录?

这是唯一的方法,然后拨打user.update({:field => value ...})或者有更好的方法来实现这一目标吗?

2 个答案:

答案 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