Question

Pour un projet, je travaille actuellement sur je dois mettre en œuvre l'objet versioning. Malheureusement, je dois garder un historique complet de chaque objet, donc une solution de table unique comme Papertrail serait rapidement devenu un gérable. Il y a des caractéristiques de Papertrail qui me plaît, cependant, que je ne l'ai pas été en mesure de trouver une solution avec des tables individuelles pour chaque modèle (par exemple acts_as_versioned).

  • Possibilité de stocker des méta-informations à la fois contrôleur et le modèle
  • Les données sont sérialisé si les modifications de schéma ne modifient pas la table version
  • méthodes puissantes pour les versions traversantes
  • Suivi automatique de la responsabilité du changement

Il y a aussi quelques caractéristiques qui Papertrail ne dispose pas qui serait bonus:

  • intégré dans la version support diff
  • différentiel au lieu de versions complètes

J'envisage actuellement bifurquer Papertrail utiliser des tables individuelles pour chaque modèle, mais je voudrais sauver cet effort s'il y a une solution existante.

Mise à jour: Versions Vestal par défaut utilise une seule table, mais en fournissant une classe de version personnalisée pour chaque modèle et en utilisant la méthode « set_table_name » de ActiveRecord, j'ai pu créer des tables séparées pour chaque modèle. Versions Vestal a également construit à l'appui diff, bien que son interface est pas aussi puissant que Papertrails. Il manque également un soutien de l'association.

Mise à jour 2: Comme Papertrail semble être un projet plus actif que j'ai bifurqué la pierre précieuse et a ajouté à l'appui de classe personnalisée similaire aux versions vestales qui permet maintenant la possibilité de définir des tables séparées par modèle. Ma fourchette est ici, mais je l'espère, il sera tiré dans le principal dépôt de projet sous peu. https://github.com/benzittlau/paper_trail

Était-ce utile?

La solution

Vous pouvez spécifier les sous-classes version personnalisée avec l'option: 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

Cela vous permet de stocker les versions de chaque modèle dans une table séparée, ce qui est utile si vous avez beaucoup de versions en cours de création.

Autres conseils

Je me sers Vestal Versions , un petit bijou rails / plugin qui utilise le modèle memento pour créer une table d'historique, et il enregistre un diff d'attributs dans after_save et after_destroy callbacks.

Il enregistre également quand il a été changé et incrémente un numéro de version afin que vous puissiez revenir à une certaine version ou une version présente à une certaine date ou l'heure.

Je peux alors tirer vers le haut un objet comme ceci:

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

Je suis un fan assez grand.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top