5

Sono bloccato. Ho cercato di capire come includere le modifiche all'associazione (has_many, has_many through) su un modello che ha papertrail. Vorrei chiamare MyModel.versions.first.changeset e fare in modo che eventuali modifiche apportate agli oggetti associati siano incluse nell'hash .changeset restituito da quella versione dell'oggetto.Rails/Papertrail: changeset con modifiche dell'associazione

Ho aggiunto i migrazioni per le associazioni di versione:

class CreateVersionAssociations < ActiveRecord::Migration 
    def self.up 
    create_table :version_associations do |t| 
     t.integer :version_id 
     t.string :foreign_key_name, :null => false 
     t.integer :foreign_key_id 
    end 
    add_index :version_associations, [:version_id] 
    add_index :version_associations, [:foreign_key_name, :foreign_key_id], :name => 'index_version_associations_on_foreign_key' 
    end 

    def self.down 
    remove_index :version_associations, [:version_id] 
    remove_index :version_associations, :name => 'index_version_associations_on_foreign_key' 
    drop_table :version_associations 
    end 
end 


class AddTransactionIdColumnToVersions < ActiveRecord::Migration 
    def self.up 
    add_column :versions, :transaction_id, :integer 
    add_index :versions, [:transaction_id] 
    end 

    def self.down 
    remove_index :versions, [:transaction_id] 
    remove_column :versions, :transaction_id 
    end 
end 

ho aggiunto Papertrail agli oggetti associati, ma per quanto posso dire, non v'è alcuna documentazione discutere le modifiche il recupero che hanno avuto luogo sul oggetti associati. Qualcuno può aiutare se questo è possibile utilizzando Papertrail?

Sto tentando di implementare una traccia di controllo delle modifiche su un modello e sugli oggetti associati a cui è possibile accedere in un changeset.

+0

Penso che sto cercando una funzionalità simile. Vorrei registrare una modifica 'belongs_to' sull'oggetto' has_many'. Ad esempio, se un 'Person' ha molti' PhoneNumber's e tu modifichi/aggiunga/cancelli un numero di persone, registrerà quella modifica come una modifica a _person_ non la registra come una modifica al numero di telefono. – Luke

+0

@Luke, sì, ci ho provato un po 'indietro, ma non sembra che questi tipi di tracciamento assocaition lo abbiano già fatto completamente in papertrail, ecco un vecchio biglietto che descrive alcune difficoltà, ci hanno lavorato per la versione futura, io tieni d'occhio ogni tanto https://github.com/airblade/paper_trail/issues/503 – heinztomato

risposta

0

Le informazioni necessarie vengono infine memorizzate nelle tabelle pertinenti versions e version_associations.

Tuttavia, paper_trail non fornisce i metodi per accedere alle informazioni nel modo desiderato. Ma puoi scrivere tu stesso un metodo personalizzato per ottenere un elenco delle versioni delle associazioni di un oggetto.

Diciamo che avere i seguenti modelli:

class Article < ApplicationRecord 
    has_many :comments 
    has_paper_trail 
end 

class Comment < ApplicationRecord 
    belongs_to :article 
    has_paper_trail 
end 

Potete trovare tutte le versioni di commento di un oggetto articolo article questo modo:

PaperTrail::Version.where(item_type: 'Comment') 
        .joins(:version_associations) 
        .where(version_associations: { foreign_key_name: 'article_id', foreign_key_id: article.id }) 
        .order('versions.created_at desc') 

È possibile scimmia rattoppare la gemma, o definire questo metodo come metodo di istanza nella classe Article in modo da poterlo chiamare facilmente, ad es. article.comment_versions

Nota, quanto sopra informa non è disponibile nello article.versions.first.changeset, perché se si modifica un commento ma non l'articolo, l'articolo è non con versione, solo il commento è.

Ma il metodo precedente consente di accedere alla cronologia delle modifiche alle associazioni.

Problemi correlati