Объединение версий объекта в рельсах, таких как Papertrail, но отдельные таблицы

StackOverflow https://stackoverflow.com/questions/5346367

Вопрос

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

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

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

  • Встроенная версия Diff Support
  • Дифференциал вместо полных версий

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

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

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

Это было полезно?

Решение

Вы можете указать подклассы пользовательских версий с помощью параметра: 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

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

Другие советы

Я использовал Версии Вестала, Rails Gem/Plugin, который использует шаблон Memento для создания таблицы истории, и сохраняет различие атрибутов в обратных вызовах After_Save и After_Destroy.

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

Затем я могу поднять объект так:

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top