Я осуществляю рефакторинг основанную на направляющих регистрационную заявку события, которая имеет процесс контроля, который поражает несколько моделей ActiveRecord. Идеально, объекты не должны быть сохранены, если контроль не завершен (оплата успешно обрабатывается). Я не совсем уверен, почему это была бы плохая вещь сериализировать эти объекты в сессию временно, но я считал много раз что ее плохое заклинание. По крайней мере, нет никакого риска выхода из синхронизации с существующими записями, поскольку не будет никаких существующих записей.
Мои вопросы:
A) Это все еще проблематично для хранения записей на сессии даже при том, что они не существуют в другом месте? Даже если я изменяю модель, разве я не могу уничтожить все существующие сессии?
B) Если это может вызвать проблемы, как я должен временно хранить объекты? Я должен сохранить их и использовать булев флаг для указания постоянный по сравнению с временным состоянием? Тогда крон сценарий для избавлений от устаревших временных объектов?
Мысли?
Почему бы вам не хранить их в базе данных, но так, чтобы вы знали, что они "неполные"?
Например, вы можете добавить поле added_to_cart_at
с датой. Когда продукт добавляется в корзину, вы сохраняете запись и устанавливаете значение для этого поля. Затем, если пользователь завершает покупку, вы очищаете поле и связываете продукт с заказом.
Чтобы очистить устаревшие записи, можно настроить ежедневный cron для удаления всех записей, где added_to_cart_at
старше, чем 1.day.ago.
Проблема их хранения в сеансе заключается в том, что у сеанса ограниченное пространство. Объекты ActiveRecord приносят много накладных расходов с точки зрения места при хранении в сеансе. Если вы храните записи с плотно заполненными отношениями has_many, у вас могут возникнуть проблемы.
Я считаю, что описание Симоне Карлетти хранения частичных записей в базе данных является лучшим решением.
Но, если вы действительно хотите хранить объекты в сеансе, сохраняйте минимально возможное количество информации. Например, только идентификаторы и обновленные поля. Также сохраните информацию в виде хэша вместо того, чтобы сохранять объект непосредственно в сеансе.