2008-11-13 4 views
3

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

+0

Не могли бы вы четко указать свои модели и их ассоциации? Думаю, это поможет многим. – mwilliams 2008-11-13 13:07:47

ответ

8

Раньше я работал над онлайн-системой покупки. То, что вы хотите сделать, - это класс Order и класс LineItem. LineItems хранит данные о продукте, такие как цена, количество и, возможно, какая-то другая информация, необходимая для записи. Это сложнее, но это единственный способ узнать подробности.

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

В принципе, вы замораживаете данные до того, как человек совершит покупку. Когда они добавляются в заказ, данные замораживаются, потому что LineItems дублирует информацию о nessacary. Таким образом, когда продукт удаляется из вашей системы, вы все равно можете понимать старые заказы.

Возможно, вам захочется взглянуть на плагин-плагин «AASM» (ранее, как конечный автомат) для управления состоянием заказа.

Edit: AASM можно найти здесь http://github.com/rubyist/aasm/tree/master

+0

Прагматическая книга RoR делает магазин в качестве примера для первой половины книги. Они рекомендуют это также, и это похоже на лучший способ блокировки покупок. – 2008-11-18 03:39:52

1

Если не цены уже будут заморожены, когда элементы добавляются в порядке? Скажем, я поместил виджет в корзину, думая, что он стоит 1 доллар, и к тому времени, когда я нахожусь в реестре, он стоит 5 долларов, потому что вы изменили цену.

Обратно к вашей проблеме: Я не думаю, что это проблема языка, но функциональная. Вместо того, чтобы связывать цены с товарами, вам нужно скопировать цены. Если у каждого товара в заказе есть собственная версия цены, будущие изменения цен не повлияют на него, вы можете добавить скидки и т. Д.

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

3

Несколько вариантов:

1) Добавить номер версии вашей модели. На следующий день мы планируем расписание курсов. Частный курс может периодически обновляться, но, по причинам бизнес-правил, важно знать, как он выглядел в тот день, когда вы подписались. Добавьте :version_number к модели и find_latest_course(course_id), измените код, если необходимо, немного пошевелите. В этом случае вы не «редактируете» модели так же, как вы делаете новую, сохраните новую, обновленную версию. (Тогда, очевидно, ваши LineItems несут item_id и item_version_number.)

Этот общий шаблон может быть расширен для покрытия, содрогания, аудиторских следов.

2) Скопировать данные в LineItem Объектов на LineItem времени создания. Просто потому, что вы можете ударить has_a на что-нибудь, не означает, что вам следует. Если «LineItem» должен содержать постоянную запись одного элемента, который появился в счете-фактуре, тогда сделайте LineItem провести постоянную запись одного элемента, который появился в счете-фактуре. Затем вы можете обновить InventoryItem#current_price, не затрагивая ранее сохраненные LineItems.

3) Если вы ленивы, просто заморозите цену на объекте заказа. Не очень-то рекомендую это, но, эй, он работает в крайнем случае. Вы, вероятно, просто задерживаете день расплаты.

«Я заказал у вас 6 месяцев назад и теперь делаю свои налоги. Почему ваш книжный магазин не покажет мне половину книг, которые я заказал? Что вы имеете в виду, их идентификаторы были очищены, когда вы прекратили их продавать ?! Мне нужно знать, для чего я могу получить отчисления!

Смежные вопросы