Принадлежит к конкретной версии

Мне нужно хранить конкретную версию модели с заказом. Я планирую использовать гем управления версиями, например 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

Используя это, когда вы добавляете товар в заказ, он связывает заказ с последней версией продукта. Когда вы получите продукт, он вытащит версию; т.е. продукт, который был, когда вы создали заказ. Заставить отношения работать наоборот (т. Е. Связать товары с заказами) может быть сложнее, но это только начало.

Другие вопросы по тегам