#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