У вас есть несколько вариантов. Вот пара вещей, о которых нужно помнить:
- 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
Затем я создал наблюдателя для отслеживания изменений состояния в Порядке:
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
и т. Д.
Каждый раз, когда я перехожу через состояния Ордена, я получаю новую отметку времени, которая записывает историю каждого перехода. Я упустил много деталей реализации, но пока у меня это хорошо работает.
Ссылки: