Ruby on Rails - уменьшать столбцы с помощью ассоциаций has_many с активной записью - PullRequest
0 голосов
/ 31 января 2012

Я создаю приложение для электронной коммерции с контролем запасов и корзиной покупок.Когда платеж будет одобрен, я хочу уменьшить количество каждого товара в корзине.Это означает, что мне нужно уменьшить столбец количества продуктов, принадлежащий 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

1 Ответ

3 голосов
/ 31 января 2012

Как насчет 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)
...