Замораживание связанных объектов - PullRequest
3 голосов
/ 13 ноября 2008

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

Ответы [ 3 ]

8 голосов
/ 13 ноября 2008

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

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

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

Возможно, вы захотите взглянуть на вызов плагина rails 'AASM' (ранее действующий как конечный автомат) для обработки состояния заказа.

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

3 голосов
/ 14 ноября 2008

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

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 голос
/ 13 ноября 2008

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...