Принадлежит к конкретной версии
Мне нужно хранить конкретную версию модели с заказом. Я планирую использовать гем управления версиями, например paper_trail или vestal_versions. Я бы хотел, чтобы правильная версия автоматически загружалась вместе с заказом.
В идеале я бы просто сохранил объект с order.update_attributes(:stuff => bought_stuff)
и порядок будет помнить версию материала, чтобы последующие загрузки order.reload.stuff
оставайся тем же объектом, каким был при сохранении заказа.
Есть ли драгоценный камень, который обеспечит такую функциональность? Я не мог найти один.
Иначе, как я могу добиться этого с ActiveRecord и версионным гемом?
2 ответа
На самом деле, я мог достичь почти то, что я хочу с PaperTrail и это:
class Stuff < ActiveRecord::Base
has_paper_trail
end
class Order < ActiveRecord::Base
belongs_to :stuff
def stuff_with_version
stuff_without_version.version_at(created_at) if stuff_without_version
end
alias_method_chain :stuff, :version
end
Не уверен, что это лучший дизайн для вас, но вы можете использовать paper_trail для этого. Просто добавьте метод макроса has_paper_trail вверху класса вашей модели, и каждый раз, когда изменяется экземпляр, его сериализованная копия создается в таблице с именем "версии" вместе с полиморфным отношением к фактической модели.
Предположим, что вы хотите связать определенную версию "продукта" с заказом, начните с добавления отношения к таблице версий - т.е. миграции, которая добавляет "version_id" к вашему заказу, а затем установите отношение следующим образом:
class Order
belongs_to :version
def product
version
end
def product=(p)
version=p.versions.last
end
end
class Product
has_paper_trail
end
Используя это, когда вы добавляете товар в заказ, он связывает заказ с последней версией продукта. Когда вы получите продукт, он вытащит версию; т.е. продукт, который был, когда вы создали заказ. Заставить отношения работать наоборот (т. Е. Связать товары с заказами) может быть сложнее, но это только начало.