У вас есть несколько вариантов. Вот несколько вещей, о которых следует помнить:
- У Mongoid есть плагин управления версиями, где вы можете отслеживать версии документа.
- Вы можете создать встроенный документ для хранения заметок/изменений в модели. Используйте наблюдателя, чтобы добавить примечание, когда происходят определенные вещи. Вы можете привязать эту заметку к версии документа, если хотите.
У меня есть случай, когда я использую встроенный объект Note для отслеживания состояния и выполнения заказа. Вот примерный план того, что я сделал:
class Order
include Mongoid::Document
include Mongoid::Paranoia
include Mongoid::Timestamps
embeds_many :notes, as: :notable
# fields
end
class Note
include Mongoid::Document
include Mongoid::Timestamps
field :message
field :state
field :author
#(I can add notes to any Model through :notable)
embedded_in :notable, polymorphic: true
end
Затем я создал наблюдателя для отслеживания изменений состояния в Order:
class OrderObserver < Mongoid::Observer
def after_transition(order, transition)
order.notes.build(state: transition.to)
end
end
after_transition
— это обратный вызов, предоставляемый подключаемым модулем конечного автомата. Если вам не нужна интеграция конечного автомата, вы можете просто использовать обратные вызовы, предоставляемые Mongoid, такие как after_save
, after_update
, around_update
и т. д.
Каждый раз, когда я переключаюсь между состояниями Ордена, я получаю новую заметку с отметкой времени, в которой записана история каждого перехода. Я упустил много деталей реализации, но пока у меня это работает хорошо.
Ссылки:
person
JT.
schedule
31.08.2011