【问题标题】:How do I update a cumulative field in a Rails database (using ActiveRecord or Mongoid)?如何更新 Rails 数据库中的累积字段(使用 ActiveRecord 或 Mongoid)?
【发布时间】:2010-12-30 07:50:30
【问题描述】:

我想更新数据库表中必须具有累积值的字段。所以基本上我需要找到该字段的当前值并使用新数字对其进行更新。

我在这方面的第一次低效尝试(在 Mongoid 中)是:

v = Landlord.where(:name=>"Lorem")
v.update_attributes(:violations=>v.violations + 10)

有没有一种简单的方法,而不是先读取一个查询,然后求和,然后再编写另一个查询?

【问题讨论】:

    标签: activerecord ruby-on-rails-3 mongoid


    【解决方案1】:

    MongoDB 为这种场景提供了特殊的原子更新操作支持——看看the Updating documentation 中的$inc 修饰符。您在普通 mongo 控制台中的示例将是:

    db.landlords.update( { name:"Lorem" }, { $inc: { violations : 10 } } );
    

    对于 Mongoid,这将是:

    Landlord.where(:name => "Lorem").first.inc(:violations, 10)
    

    如果该字段已在您的模型上定义但尚未初始化为任何值,这会将违规设置为 10。

    但实际上,这仍然执行了两个查询(查找楼主,然后更新它)。要一次性完成所有操作,您需要通过 Mongoid::Collection 对象,该对象将大多数调用直接代理到 Mongo Ruby 驱动程序。看起来像这样:

    Landlord.collection.update({ :name => "Lorem" }, '$inc' => { :violations => 10 })
    

    当您想采取更直接的控制时,熟悉the Ruby driver 会有所帮助。它的 API 试图与 mongo Javascript shell 语法紧密匹配。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-15
      • 1970-01-01
      • 2012-03-31
      • 2019-03-25
      • 2017-10-30
      • 1970-01-01
      • 1970-01-01
      • 2019-07-03
      相关资源
      最近更新 更多