2010-09-11 4 views
1

je les modèles suivants:Ajout d'une table associée à une table (Livre> Révision)

class Instance < ActiveRecord::Base 
has_many :users 
has_many :books 
end 
class User < ActiveRecord::Base 
belongs_to :instance 
end 
class Book < ActiveRecord::Base 
belongs_to :instance 
end 

Je veux maintenant ajouter une table de BookRevision, qui a les colonnes suivantes (id, user_id version # (incrément automatique), diff (ancienne copie du livre), horodatages) Logic:

  • Lorsqu'un livre est créé, un enregistrement est ajouté à la table BookRevision, donc nous savons qui a créé le livre le premier lieu
  • Quand un livre est mis à jour, un enregistrement est ajouté à la user_id (pourrait être un autre utilisateur), et une nouvelle version

    , et l'ancien texte du livre, pour servir d'archives.

Étant donné que je l'instance, l'utilisateur, table de livre dans mes rails mettre en œuvre ajoutent, sont ces étapes pour faire corriger ce qui précède viennent à la vie? - Ajouter une migration pour la table BookRevision .... rails génèrent la migration AddTableBookRevision user_id: entier Version: integer diff: texte - Puis mettre à jour les modèles suivants:

class Instance < ActiveRecord::Base 
has_many :users 
has_many :books 
end 
class User < ActiveRecord::Base 
belongs_to :instance 
end 
class Book < ActiveRecord::Base 
belongs_to :instance 
has_many :BookRevisions 
end 
class BookRevision < ActiveRecord::Base 
belongs_to :Book 
end 

Puis, dans mon contrôleur, lorsque ajouter un nouveau livre? En ce moment j'ai:

@book = Book.create(params[:book].merge(:instance_id => 
current_user.instance_id)) 

Comment mettre à jour cela pour tenir compte de l'association BookRevision? Merci de votre aide!

Répondre

1

Vous pourriez vouloir vérifier quelque chose comme acts_as_versioned au lieu de rouler le vôtre. Cela fonctionne de la manière que vous avez décrite ici, où les modifications sont enregistrées dans une table distincte mais liée. Gardez à l'esprit que vous devrez appliquer des migrations à votre table Book et à votre table BookRevision en parallèle à partir de ce point. Ils doivent être compatibles avec le schéma pour la révision au travail. J'ai construit un système de suivi de version de ce type qui utilisait des modèles sérialisés pour éviter d'avoir à maintenir des migrations, dans le but de préserver l'état exact du modèle indépendamment des modifications futures via les migrations. Cela présente l'inconvénient de ne pas pouvoir revenir à une version plus ancienne arbitraire car il peut y avoir une mauvaise correspondance de schéma.

Questions connexes