0

属性の現在の値とパラメーターとして送信している値を計算して属性を更新する 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'
4

2 に答える 2

3

これはドキュメント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)})

これにより、データベースでの追加操作が行われることに注意してください。

于 2012-06-17T05:08:27.410 に答える
0

すべてを更新していて、手持ちの数量が変わる可能性があるため、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

私はこれをテストしていませんが、これはあなたを正しい方向に向けるはずです。

于 2012-06-17T04:52:10.463 に答える