Управление версиями объектов в Rails, например Papertrail, но отдельные таблицы - PullRequest
13 голосов
/ 18 марта 2011

Для проекта, над которым я сейчас работаю, мне нужно реализовать управление версиями объектов.К сожалению, мне нужно вести полную историю каждого объекта, поэтому решение для одной таблицы, такое как Papertrail, быстро станет неуправляемым.Однако мне нравятся функции Papertrail, которые я не смог найти в решении с отдельными таблицами для каждой модели (например, activ_as_versioned).

  • Возможность хранения метаинформацииот контроллера и модели
  • Данные сериализуются, поэтому изменения схемы не изменяют таблицу версий
  • Мощные методы для просмотра версий
  • Автоматическое отслеживание ответственности за изменения

Есть также некоторые функции, которых нет у Papertrail, которые могут быть бонусами:

  • Поддержка diff встроенной версии
  • Дифференциал вместо полных версий

В настоящее время я рассматриваю возможность использования Papertrail для использования отдельных таблиц для каждой модели, но хотел бы сэкономить эти усилия, если есть существующее решение.

Обновление: Vestal Versions по умолчанию использует одну таблицу, но, предоставив собственный класс версий для каждой модели и используя метод "set_table_name" ActiveRecord, я смог создать отдельные таблицыдля каждой модели.Vestal Versions также имеет встроенную поддержку diff, хотя его интерфейс не такой мощный, как Papertrails.В нем также отсутствует поддержка ассоциаций.

Обновление 2: Поскольку papertrail кажется более активным проектом, я разветвил этот камень и добавил поддержку пользовательских классов, аналогичную версиям vestal, которые теперь позволяютвозможность определять отдельные таблицы для каждой модели.Мой форк уже здесь, но я надеюсь, что он скоро будет добавлен в основной репозиторий проекта.https://github.com/benzittlau/paper_trail

Ответы [ 2 ]

12 голосов
/ 29 октября 2011

Пользовательские версии подклассов можно указать с помощью опции: class_name:

class Post < ActiveRecord::Base
  has_paper_trail :class_name => 'PostVersion'
end

class PostVersion < Version
  # custom behaviour, e.g:
  self.table_name = :post_versions # in rails 2, use set_table_name
end

Это позволяет хранить версии каждой модели в отдельной таблице, что полезно, если у вас создается много версий.

0 голосов
/ 18 марта 2011

Я использовал Vestal Versions , гем / плагин rails, который использует шаблон memento для создания таблицы истории и сохраняет различные атрибуты в обратных вызовах after_save и after_destroy.

Он также записывает, когда он был изменен, и увеличивает номер версии, чтобы вы могли выполнить откат к определенной версии или версии, присутствующей в определенную дату или время.

Затем я могу вытянуть объект примерно так:

@user = User.last
@user.versions.last.changes #=> {:name => ['Robert','Bob']}

Я довольно большой поклонник.

...