轨道上的红宝石 - 如何保持不同型号的两个记录同步,而不会陷入回调陷阱



我在两个模型上有属性,我想保持同步。

1.9.3p194 :009 > p
 => #<Product id: 19, name: "Long Sleeve Blue", description: "<p>tLong Sleeve Blue Flannel shirt comes in all siz...", price: 49.99, vendor_id: 12, created_at: "2012-12-15 23:35:05", updated_at: "2013-01-24 19:11:18", image: "shirt.png", sku: "ABC10034"> 
1.9.3p194 :010 > p.piggybak_sellable
 => #<Piggybak::Sellable id: 1, sku: "AR4590", description: "Blue Shirt", price: #<BigDecimal:7fa97cd63ff8,'0.2499E2',18(45)>, quantity: 100, item_id: 19, item_type: "Product", active: true, unlimited_inventory: false> 

这两者具有一些相似的属性。

我有创建方面 - 一旦创建了新记录,我只需做一个after_create

问题在于记录的更新。

如果我调用一个after_save并在after_save调用的方法中执行update_attributes,它会启动无限循环并使应用程序崩溃。

鉴于我想更新许多列,我如何实现这一点?

我知道一种解决方案是使用 update_column - 但这仅适用于 1 列。

思潮?

您可以在

每个after_save回调中暂时停用其他模型上的回调,以避免像这样循环。有关执行此操作的详细信息,请参阅此问题的第二个答案 如何跳过活动记录回调?

可能看起来像这样:

after_save :update_product
def update_product
  Product.skip_callback(:save, :after, :update_other)
  p = Product.find_by_whatever(self.whatever)
  p.update_attributes(:one => self.one, :two => self.two)
  Product.set_callback(:save, :after, :update_other)
end

相关内容

  • 没有找到相关文章

最新更新