Кто-нибудь знает какой-либо метод в Rails, с помощью которого связанный объект может быть заморожен. Проблема, с которой я сталкиваюсь, заключается в том, что у меня есть модель заказа со многими позициями, которые, в свою очередь, относятся к продукту или услуге. Когда заказ оплачивается, мне нужно заморозить детали заказанных предметов, чтобы при изменении цены сохранялись итоговые суммы заказа.Замораживание связанных объектов
ответ
Раньше я работал над онлайн-системой покупки. То, что вы хотите сделать, - это класс Order и класс LineItem. LineItems хранит данные о продукте, такие как цена, количество и, возможно, какая-то другая информация, необходимая для записи. Это сложнее, но это единственный способ узнать подробности.
Заказ просто состоит из LineItems и, возможно, содержит адреса доставки и выставления счетов. Общая стоимость заказа может быть рассчитана путем сложения LineItems.
В принципе, вы замораживаете данные до того, как человек совершит покупку. Когда они добавляются в заказ, данные замораживаются, потому что LineItems дублирует информацию о nessacary. Таким образом, когда продукт удаляется из вашей системы, вы все равно можете понимать старые заказы.
Возможно, вам захочется взглянуть на плагин-плагин «AASM» (ранее, как конечный автомат) для управления состоянием заказа.
Edit: AASM можно найти здесь http://github.com/rubyist/aasm/tree/master
Прагматическая книга RoR делает магазин в качестве примера для первой половины книги. Они рекомендуют это также, и это похоже на лучший способ блокировки покупок. – 2008-11-18 03:39:52
Если не цены уже будут заморожены, когда элементы добавляются в порядке? Скажем, я поместил виджет в корзину, думая, что он стоит 1 доллар, и к тому времени, когда я нахожусь в реестре, он стоит 5 долларов, потому что вы изменили цену.
Обратно к вашей проблеме: Я не думаю, что это проблема языка, но функциональная. Вместо того, чтобы связывать цены с товарами, вам нужно скопировать цены. Если у каждого товара в заказе есть собственная версия цены, будущие изменения цен не повлияют на него, вы можете добавить скидки и т. Д.
На самом деле, чтобы быть чистым, вам нужно добавить управление версиями к своим ценам. Когда цена товара изменяется, вы не перезаписываете цену, вы добавляете более новую версию. Позиции в вашем заказе все равно будут связаны со старой ценой.
Несколько вариантов:
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 месяцев назад и теперь делаю свои налоги. Почему ваш книжный магазин не покажет мне половину книг, которые я заказал? Что вы имеете в виду, их идентификаторы были очищены, когда вы прекратили их продавать ?! Мне нужно знать, для чего я могу получить отчисления!
- 1. EF: Загрузка связанных объектов связанных объектов
- 2. Автоматическое замораживание объектов после инициализации
- 3. Использование Linq для выбора списка объектов, связанных объектов, связанных объектов
- 4. Джанго извлечение связанных объектов
- 5. добавление связанных объектов?
- 6. Validate количество связанных объектов
- 7. RestKit Сериализация связанных объектов
- 8. создание способа связанных объектов
- 9. Fetching объектов, связанных с
- 10. Сериализация связанных объектов
- 11. Сохранение связанных объектов
- 12. Сохранение связанных объектов модели
- 13. Ответственность создания связанных объектов
- 14. Моделирование связанных объектов
- 15. Обновление связанных объектов DDD
- 16. Агрегация фильтрованных связанных объектов
- 17. Сериализация связанных объектов
- 18. Замораживание объектов с помощью веб-работника
- 19. Замораживание общих объектов cx_freeze в Linux
- 20. git замораживание при нажатии при сжатии объектов
- 21. Получить список связанных объектов из списка объектов
- 22. Активные записи связанных объектов в списке объектов
- 23. Создание таблицы из объектов связанных объектов
- 24. Django, получение связанных объектов в петле объектов
- 25. XAML Связывание объектов, связанных с
- 26. Сериализация связанных объектов в java
- 27. Связанные объекты EF связанных объектов
- 28. Джанго комплекс фильтрация связанных объектов
- 29. Многопоточность без плотно связанных объектов
- 30. Исключение при получении связанных объектов
Не могли бы вы четко указать свои модели и их ассоциации? Думаю, это поможет многим. – mwilliams 2008-11-13 13:07:47