Я создаю приложение для электронной коммерции с контролем запасов и корзиной покупок.Когда платеж будет одобрен, я хочу уменьшить количество каждого товара в корзине.Это означает, что мне нужно уменьшить столбец количества продуктов, принадлежащий line_items, который принадлежит тележкам.
Я могу уменьшить единицу с помощью интерфейса активной записи, как показано ниже (в моей модели корзины):
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})")
Но оба эти метода кажутся неправильными.Последний напрямую запрашивает схему БД, что, очевидно, не лучшая практика.Первый способ лучше, но я не знаю, как реализовать его на всех записях.
Мои модели выглядят так:
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
Я уверен, что есть элегантный способ сделать это.Кто-нибудь может мне помочь, пожалуйста?
Большое спасибо,
Rim