принадлежит_определенной версии

Мне нужно хранить конкретную версию модели с заказом. Я планирую использовать гем управления версиями, например paper_trail или vestal_versions. Я хочу, чтобы правильная версия автоматически загружалась вместе с заказом.

В идеале я бы просто сохранил объект с order.update_attributes(:stuff => bought_stuff), и заказ запомнил бы версию материала, чтобы при последующих загрузках order.reload.stuff по-прежнему оставался объектом, каким он был при сохранении заказа.

Есть ли драгоценный камень, который обеспечит такую ​​​​функциональность? Я не мог найти ни одного.

В противном случае, как я могу добиться этого с помощью ActiveRecord и жемчужины управления версиями?


person Michaël Witrant    schedule 04.10.2012    source источник


Ответы (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
person Michaël Witrant    schedule 04.10.2012

Не уверен, что это лучший дизайн для вас, но вы можете использовать для этого 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

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

person griswoldbar    schedule 04.10.2012