【问题标题】:Rails 3.2 update conditionsRails 3.2 更新条件
【发布时间】:2012-06-17 04:43:52
【问题描述】:

我有一个 Rails 模型,我想通过计算该属性的当前值加上我作为参数发送的值来更新属性。以下将更新记录并覆盖属性的现有值

def self.mark_receipt(qty_received,client_id,product_code)
  Product.where(:client_id => client_id, :product_code => product_code)
         .update_all(:qty_on_hand => :qty_received,
                     :qty_received => qty_received)
end

我想要更像这样的东西,但是下面的语法不起作用。

def self.mark_receipt(qty_received,client_id,product_code)
  Product.where(:client_id => client_id, :product_code => product_code)
         .update_all(:qty_on_hand => :qty_on_hand + qty_received,
                     :qty_received => :qty_received + qty_received)
end

编辑

与下面的答案非常接近,但这是 sql 在后台运行的内容

Product Load (0.5ms)  SELECT `products`.* FROM `products` 
                      WHERE `products`.`client_id` = 1 AND `products`.`product_code` = '88-89c'
  SQL (0.6ms)         UPDATE `products` 
                      SET `qty_on_hand` = 165, `qty_received` = 165

而不是

 UPDATE `products`
 SET `qty_on_hand` = 165, `qty_received` = 165
 WHERE `products`.`client_id` = 1 AND `products`.`product_code` = '88-89c'

【问题讨论】:

    标签: ruby-on-rails ruby activerecord ruby-on-rails-3.2


    【解决方案1】:

    我相信这会根据文档起作用 http://apidock.com/rails/ActiveRecord/Relation/update_all

    Product.update_all(['qty_on_hand = qty_on_hand + ? , qty_received = qty_received + ?', qty_received, qty_received],
                        {:client_id => client_id, :product_code => product_code)})
    

    请注意,这将在数据库中进行添加操作。

    【讨论】:

    • 根据您的回答,我得到 ActiveRecord::PreparedStatementInvalid(错误数量的绑定变量(1 对 2)在:qty_on_hand = qty_on_hand + ? , qty_received = qty_received + ?):
    • 对不起,我只是注意到我忘了添加第二个参数。立即尝试
    • 这非常好,而且比我想象的要糟糕得多。 :D
    • 两个答案都非常有帮助。我来自 sql 世界,所以尝试使用 activerecord 是一项任务
    • @MBHNYC,您的实现的问题是它会为每个产品生成一个更新查询。随着这个答案的实现,它将只使用一个查询。
    【解决方案2】:

    由于您正在更新所有并且手头的数量可能会发生变化,您应该循环查看 where 子句的结果:

    def self.mark_receipt(qty_received,client_id,product_code)
      Product.where(:client_id => client_id, :product_code => product_code).each do |p|
        p.update_attributes(:qty_on_hand=> p.qty_on_hand + qty_received, :qty_received => p.qty_received + qty_received)
      end
    end
    

    我尚未对此进行测试,但这应该会为您指明正确的方向。

    【讨论】:

    • 它可以工作,但是它似乎更新了所有记录,而不仅仅是条件找到的记录。我需要什么方法只更新满足 where 子句中指定条件的记录?
    • 在你的帮助下,我已经很接近了。查看上面的 sql 输出,看看我们可以从这里得到什么。
    • 小注意,你不需要“产品”,因为范围已经是产品对象,只要从“哪里”开始就可以了。现在看 SQL
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多