Rails: Как увеличить / уменьшить столбец количества на основе связанных событий модели, без двойного счета? - PullRequest
1 голос
/ 03 марта 2012

Буду признателен за некоторые идеи и советы, которые помогут согласовать дизайн моей модели с моей бизнес-логикой в ​​приложении Rails 3.2.

У меня есть модель Продукта, модель Заказа, в которой есть много Ordered_Products, и модель Счет-фактуры, в которой есть много Sold_Products.

В форме «Заказ» пользователь устанавливает сведения о заказе, а затем добавляет вложенные Ordered_Products и их количества.

Форма счета-фактуры действует аналогичным образом.

Модель продукта имеет столбец запаса или количества, в котором записывается общее количество товаров, которые были в наличии.

Я хочу, чтобы запас изменялся при создании заказов и счетов, и я мог бы сделать что-то вроде after_create :decrement_product_stock в модели Sold_Products, аналогично для Ordered_Products.

Здесь бизнес-логика вступает в игру. Заказы не выполняются сразу. Заказ может быть размещен, но не доставлен в течение некоторого времени. Запас не должен быть увеличен, пока запас не прибудет.

Таким образом, я мог бы добавить логическое значение order_fullfilled в форму Orders и запускать инкремент, только если order_fullfilled имеет значение true.

Но что если пользователю нужно вернуться в форму заказа, чтобы внести некоторые изменения. Когда они обновляют запись, метод приращения будет вызван снова, на этот раз с ошибкой?

То же самое произойдет, если счет нужно будет отредактировать.

Кто-нибудь сталкивался с подобной проблемой? Может ли кто-нибудь дать совет по вопросам, о которых я должен подумать здесь? Как лучше всего справиться с этим делом?

Ценю любые идеи. Спасибо!

1 Ответ

2 голосов
/ 04 марта 2012

Энди, основываясь на вашем вопросе (извините, я немного запутался), я думаю, у вас есть поле в вашем OrderedProduct, которое соответствует increment и decrement запаса его продукта в зависимости от того, был ли заказвыполнено.

Я думаю, что при первом оформлении заказа на продукт вы, вероятно, должны решить, хотите ли вы уменьшить запас.Если вы это сделаете, то можете потерять клиентов, так как некоторые заказы будут отменены, но вы с готовностью уменьшили свой запас.И наоборот, отсутствие декремента после создания OrderedProduct может привести к перепроданности.

Не зная вашего случая, я думаю, что вы можете сделать обратный вызов before_update для вашего OrderedProduct.Я пытался использовать код, который вы разместили, чтобы структурировать то, что, по моему мнению, может работать.

Дайте мне знать, если это работает для вас.Лично я не совсем уверен, как работают increment/decrement методы.Если да, обновите мой ответ =)

class OrderedProduct < ActiveRecord::Base

  before_update :check_order_fulfilled

  def check_order_fulfilled
    if order_fulfilled_changed? 
      if order_fulfilled
        self.product.increment!(:stock, self.quantity - self.quantity_was)
      else
      #  self.product.decrement!  # Some incomplete logic, decrement if order_fulfilled                #set to false?
    end
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...