Рельсы 6 Бумажный трейлер тянет бревна только с одной модели

#ruby-on-rails #paper-trail-gem

Вопрос:

Предположим, я отслеживаю две модели в своем приложении Rails 6 с помощью PaperTrail gem — Book и User . Теперь я хочу сгенерировать CSV-файл только с журналами, который включает только Book действия моделей. Как, например, вытащить версии только для одной модели Book ?

 # models
class Book
  has_paper_trail
end

class User
  has_paper_trail
end

#call method for csv_generator service

    def call
      CSV.generate(col_sep: ';', write_headers: true, headers: LOG_HEADERS, encoding: 'UTF-8') do |csv|
        PaperTrail::Version.includes([:item]).limit(50).order(id: :desc).each do |v|
          tracked_data(v)
          csv << [v.created_at.in_time_zone('CET'),
                  v.event,
                  version.whodunnit,
                  @new_data_value]
        end
      end
    end
 

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

Ответ №1:

Миграция по умолчанию добавляет item_type столбец, который используется для отслеживания таблиц.

В данном случае вы можете сделать: PaperTrail::Version.where(item_type: 'Book') который найдет для вас все версии для всех изменений в таблице книг.

Если вы хотите сделать по экземпляру книги, это было бы просто:

 Book.all.each do |book|
  book.versions
end