1

我正在使用以下数据映射器从我的数据库中创建/获取新用户:

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

这将获取 id = data['id'] 的用户,或者如果它不存在则创建它。

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

是这样做的唯一方法然后调用user.update({:field => value ...})还是有更好的方法来实现这一点?

4

2 回答 2

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_createwith an:id将尝试使用该特定创建模型。:id这可能不是你想要的。

或者,您可以使用first_or_new. 但是,您不能调用update使用它创建的对象,因为该记录不存在(尽管我相信这可能在以前版本的 DataMapper 中有效)。

于 2011-07-13T23:07:57.840 回答
0

只是对于遇到此答案的任何人, User.first_or_create({:id => data['id']}) 不会“使用 id = data['id'] 获取用户或在它尚不存在时创建它。” 它实际上获取了表中的第一条记录并更改了它的 id t0 data['id']。

要实际获取具有该 id 的第一条记录,或者如果它不存在则创建它,您需要使用 where 子句:

User.where(id: data['id]).first_or_create
于 2016-07-04T13:33:55.503 回答