after_update回调不会更新属性

Pri*_*ogu 1 ruby mysql activerecord ruby-on-rails

美好的一天...我已经为将要更新的特定列实现了 after_update 回调,在该列更新后,回调的目的是将新更新的值添加到另一列,即

class Product < ActiveRecord::Base
after_update :update_stock, :if => :produced_changed?

private 

def update_stock
    self.stock = self.stock + self.produced 
end     
end
Run Code Online (Sandbox Code Playgroud)

当我运行 Rails 控制台并运行“Product.update generated:450”时,stock 列将自动添加新值。即它工作完美,但是当我尝试从“视图/控制器”更新时,它根本不起作用。

请问有什么原因吗?

2.2.4 :004 > h
 => Product id: 1, name: "MAC Air Filter", partnumber: 33440, description: "Air filter", **stock: 3440**, created_at: "2016-04-08 11:38:58", updated_at: "2016-04-19 20:33:00", **produced: 33** 

2.2.4 :006 > h.update **produced:3000**
   (0.1ms)  SAVEPOINT active_record_1
  SQL (1.4ms)  UPDATE "products" SET "produced" = ?, "updated_at" = ? WHERE "products"."id" = ?  [[**"produced", 3000**], ["updated_at", "2016-04-20 13:57:59.377954"], ["id", 1]]
   (0.1ms)  RELEASE SAVEPOINT active_record_1
 => true 

2.2.4 :007 > h
 => Product id: 1, name: "MAC Air Filter", partnumber: 33440, description: "Air filter", **stock: 6440**, created_at: "2016-04-08 11:38:58", updated_at: "2016-04-20 13:57:59", **produced: 3000**> 
Run Code Online (Sandbox Code Playgroud)

Gan*_*war 5

您已将产品库存保存到update产品中。在回调中,update_stock您仅设置产品库存的值。self.stock = self.stock + self.produced仅设置产品库存的价值。

要更新库存值,您必须在回调中保存为:

class Product < ActiveRecord::Base
after_update :update_stock, :if => :produced_changed?

private 

def update_stock
    self.stock = self.stock + self.produced
    self.save
end     
end
Run Code Online (Sandbox Code Playgroud)

但它运行无限循环并给出错误。因此,您必须在更新之前使用 before_update 回调设置库存值。

  class Product < ActiveRecord::Base
    before_update :update_stock, :if => :produced_changed?

    private 

    def update_stock
        self.stock = self.stock + self.produced
    end     
 end
Run Code Online (Sandbox Code Playgroud)

以及save控制器中产品的价值。