【问题标题】:DataMapper first_or_create always set certain field?DataMapper first_or_create 总是设置某些字段?
【发布时间】:2016-07-04 21:33:55
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: ruby orm sinatra ruby-datamapper


    【解决方案1】:

    嗯,你可以写成一行:

    (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 中有效)。

    【讨论】:

    • 谢谢,太好了。最后,我使用 first_or_create 方法生成 User 实例,然后调用 attributes= 然后 save 设置属性。我认为这种方法使用的 SQL 查询最少?
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2012-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-10
      • 2010-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多