2012-01-31 118 views
0

我正在构建一个包含库存控制和购物车的电子商务应用程序。当付款获得批准后,我想减少购物车中每个产品的数量。这意味着,我需要减少属于属于购物车的line_items的产品数量列。Ruby on Rails - 通过活动记录has_many协会减少列

我可以递减一个通过这样的活动记录界面(在我的车模型):通过直接执行查询

self.line_items[0].product.decrement(:qty) 

而且也:

connection.execute("UPDATE products SET qty = qty - 1 WHERE id IN (SELECT product_id FROM line_items WHERE cart_id = #{self.cart_id})") 

这些方法唐但两者看起来不错。后者直接查询db模式,这显然不是最佳实践。第一种方法更好,但我不知道如何在所有记录上实现它。

我的模型,像这样:

class Product < ActiveRecord::Base 
end 

class Cart < ActiveRecord::Base 
    has_many :line_items 
end 

class LineItem < ActiveRecord::Base 
    belongs_to :cart 
    belongs_to :product 
end 

的模式是:

create_table "carts", :force => true do |t| 
    .. 
end 

create_table "line_items", :force => true do |t| 
    .. 
    t.integer "product_id" 
    t.integer "cart_id" 
end 

create_table "products", :force => true do |t| 
    .. 
    t.integer "qty" 
end 

我相信有一个优雅的方式来做到这一点。任何人都可以帮助我吗?

非常感谢,
沿岸

回答

3

如何update_counters? http://apidock.com/rails/ActiveRecord/CounterCache/update_counters

class Cart < ActiveRecord::Base 
    has_many :line_items 
    has_many :products, :through => :line_items 
end 

Product.update_counters(cart.products, :qty => -1) 
# => UPDATE "products" SET "qty" = COALESCE("qty", 0) - 1 WHERE "products"."id" IN (1, 2) 
+0

我知道会有这样一个很好的整洁的答案。这就是我喜欢铁轨的原因。非常感谢您的帮助! – Rimian 2012-01-31 23:20:57