5

Я застрял. Я пытался выяснить, как включить изменения ассоциации (has_many, has_many through) на модель, имеющую papertrail. Я хотел бы позвонить MyModel.versions.first.changeset и внести любые изменения, произошедшие на связанных объектах, в хэш-код .changeset, который возвращается из этой версии объекта.Rails/Papertrail: Изменения с изменениями ассоциации

Я добавил миграции для версии ассоциаций:

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 

Я добавил Papertrail к ассоциированным объектам, но, насколько я могу сказать, что нет никакой документации, обсуждая ВОССТАНОВЛЕНИЕ изменения, которые произошли на связанных объектов. Может ли кто-нибудь помочь, если это возможно с помощью Papertrail?

Я пытаюсь реализовать контрольный журнал изменений в модели и связанных с ней объектах, к которым можно получить доступ в одном наборе изменений.

+0

Я думаю, что я ищу аналогичную функцию. Я хотел бы записать изменение 'own_to' в' has_many'. Например, если «Лицо» имеет много «PhoneNumber's» и вы меняете/добавляете/удаляете номер человека, оно записывает это изменение как изменение на _person_, а не записывает его как изменение на номер телефона. – Luke

+0

@ Люк, да, я попробовал некоторое время назад, но это не похоже, что эти типы отслеживания ассоциаций полностью превратили его в papertrail, вот как старый билет, описывающий некоторые трудности, они работают над ним для будущей версии, i следите за ним каждый раз через некоторое время https://github.com/airblade/paper_trail/issues/503 – heinztomato

ответ

-1

Похоже, это было добавлено в качестве экспериментальной функции к papertrail жемчужину

ЗАКАНЧИВАТЬ документы здесь https://github.com/airblade/paper_trail/blob/v4.2.0/README.md#associations

Это изменение потребует добавления новой таблицы базы данных для papertrail отслеживать связанных моделей.

0

Необходимая информация в конечном итоге хранится в соответствующих таблицах versions и version_associations.

Однако paper_trail не предоставляет способы доступа к информации так, как вы хотите. Но вы можете написать собственный метод самостоятельно, чтобы получить список версий объекта ассоциации.

Допустим, у вас есть следующие модели:

class Article < ApplicationRecord 
    has_many :comments 
    has_paper_trail 
end 

class Comment < ApplicationRecord 
    belongs_to :article 
    has_paper_trail 
end 

Вы можете найти все комментарий версии объекта статьи article этот путь:

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

Вы можете обезьяна патч камень, или определить этот метод является методом экземпляра класса Article, поэтому вы можете легко его называть, например article.comment_versions

Примечание: ation не доступно в article.versions.first.changeset, потому что, если вы изменили комментарий, но не статью, статья не версия, только комментарий есть.

Но вышеописанный метод позволяет получить доступ к истории изменений в ассоциациях.

Смежные вопросы