Domanda

Per un progetto che sto attualmente lavorando su Ho bisogno di implementare oggetto delle versioni. Purtroppo ho bisogno di mantenere una storia completa di ogni oggetto, in modo da una singola soluzione di tavolo come Papertrail diventerebbe rapidamente un-gestibile. Ci sono caratteristiche di Papertrail che mi piace, però, che non sono stato in grado di trovare in una soluzione con tavoli individuali per ciascun modello (come acts_as_versioned).

  • capacità di memorizzare meta-informazioni sia controllore e il modello
  • I dati vengono serializzati in modo modifiche dello schema non modificano la tabella delle versioni
  • potenti metodi per le versioni di movimento
  • L'inseguimento automatico di cambiamento responsabilità

Ci sono anche alcune caratteristiche che Papertrail non ha che sarebbe bonus:

  • Il supporto incorporato versione diff
  • differenziale invece di versioni complete

Al momento sto pensando di sborsare Papertrail da utilizzare singole tabelle per ogni modello, ma vorrei salvare questo sforzo se c'è una soluzione esistente.

Aggiornamento: Versioni Vestal di default usa una singola tabella, ma fornendo una classe versione personalizzata per ogni modello e con il metodo "set_table_name" di ActiveRecord, sono stato in grado di creare tabelle separate per ciascun modello. Versioni Vestal ha anche un supporto incorporato diff, anche se la sua interfaccia non è potente come Papertrails. Manca anche il supporto dell'associazione.

Aggiornamento 2: Come papertrail sembra essere un progetto più attivo che ho biforcato la gemma e aggiunto a sostegno classe personalizzata simile alle versioni vestali che ora permette la possibilità di definire le tabelle separate per modello. La mia forcella è qui, ma spero che sarà tirato nel repository principale progetto a breve. https://github.com/benzittlau/paper_trail

È stato utile?

Soluzione

È possibile specificare la versione sottoclassi personalizzati con l'opzione: 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

Questo consente di memorizzare le versioni di ogni modello in una tabella separata, che è utile se si hanno un sacco di versioni in fase di creazione.

Altri suggerimenti

Ho usato Versioni Vestal , una gemma rotaie / plugin che utilizza il modello di memento per creare un tavolo di storia, e consente di risparmiare un diff di attributi in after_save e after_destroy callback.

Si registra anche quando è stato cambiato e incrementi di un numero di versione in modo da poter eseguire il rollback ad una determinata versione o una versione presente in una certa data o l'ora.

Posso quindi tirare su un oggetto in questo modo:

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

Sono un grande fan abbastanza.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top