5

Ich stecke fest. Ich habe versucht, herauszufinden, wie man die Assoziationsänderungen (has_many, has_many through) auf einem Modell einfügt, das papertrail hat. Ich möchte MyModel.versions.first.changeset aufrufen und alle Änderungen, die an assoziierten Objekten stattfanden, in den Hash .changeset aufnehmen, der von dieser Version des Objekts zurückgegeben wird.Schienen/Papertrail: Changeset mit Assoziationsänderungen

Ich habe die Migration für Version Verbände hinzugefügt:

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 

Ich habe Papertrail zu den zugehörigen Objekten hinzugefügt, aber soweit ich das beurteilen kann, gibt es keine Dokumentation Abrufen von Änderungen der Diskussion, die auf das nahm zugehörige Objekte. Kann jemand weiterhelfen, wenn dies mit Papertrail möglich ist?

Ich versuche, einen Audit-Trail von Änderungen an einem Modell und den zugehörigen Objekten zu implementieren, auf die in einem Changeset zugegriffen werden kann.

+0

Ich denke, ich suche nach einer ähnlichen Funktion. Ich möchte eine Änderung "gehört" in das Objekt "has_many" aufnehmen. Wenn beispielsweise eine Person viele Telefonnummern hat und Sie eine Personennummer ändern/hinzufügen/löschen, wird diese Änderung als Änderung der _person_ aufgezeichnet und nicht als Änderung der Telefonnummer aufgezeichnet. – Luke

+0

@Luke Ja, ich habe es vor einiger Zeit versucht, aber es sieht nicht so aus, als ob diese Art der Assoziationsverfolgung es vollständig in Papiertrail geschafft hat, es gibt ein altes Ticket, das einige Schwierigkeiten beschreibt, sie haben daran gearbeitet für zukünftige Version, ich Behalte es ab und zu im Auge https://github.com/airblade/paper_trail/issues/503 – heinztomato

Antwort

0

Die von Ihnen benötigten Informationen werden letztendlich in den entsprechenden Tabellen versions und version_associations gespeichert.

paper_trail bietet jedoch nicht die Methoden für den Zugriff auf die Informationen in der von Ihnen gewünschten Weise. Sie können jedoch eine benutzerdefinierte Methode selbst schreiben, um eine Liste der Versionen eines Objekts zu erhalten.

Angenommen, Sie haben die folgenden Modelle haben:

class Article < ApplicationRecord 
    has_many :comments 
    has_paper_trail 
end 

class Comment < ApplicationRecord 
    belongs_to :article 
    has_paper_trail 
end 

Sie können alle Kommentar Versionen eines Artikels Objekt article diese Weise finden:

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') 

Sie können Affen den Edelstein Patch, oder definieren Diese Methode als Instanzmethode für die Artikelklasse, so dass Sie sie einfach aufrufen können, z. B. article.comment_versions

Hinweis, die oben genannten Informationen action ist nicht verfügbar in der article.versions.first.changeset, denn wenn Sie einen Kommentar, aber nicht den Artikel ändern, ist der Artikel nicht versioniert, nur der Kommentar ist.

Mit der obigen Methode können Sie jedoch auf den Verlauf der Änderungen der Zuordnungen zugreifen.