在我的 Rails6 应用程序中,我想使用导出到 CSV 文件的日志创建管理记录器活动——为此,我使用 paper_trail gem 来记录所有管理活动。我想存储所有已经产生的差异,这就是为什么我使用changeset来自 paper_trail gem 的方法,它给了我以下结果:
[33] pry(main)> PaperTrail::Version.last.changeset
=> {"name"=>["", "no name"], "is_initial_survey_filled"=>[false, true], "updated_at"=>[Mon, 31 Aug 2020 20:31:45 UTC +00:00, Mon, 31 Aug 2020 23:43:17 UTC +00:00]}
每个键的第一个值代表旧数据,数组中的第二个值代表新数据,如下所示:
name[0] = "" #old data
name[1] = "no name" #new data
is_initial_survey_filled[0] = false #old data
is_initial_survey_filled[1] = true #new data
如何获取和数据并将所有这些操作放入 CSV 文件中?
我正在尝试这样的事情:
LOG_HEADERS = ['Created at', 'Acting User', 'Old Data', 'New Data'].freeze
def call
FileUtils.mkdir_p(base_path)
CSV.open(file_path, 'w', col_sep: ';', write_headers: true, headers: LOG_HEADERS, encoding: 'UTF-8') do |csv|
PaperTrail::Version.all.each do |version|
old_data_value = version.changeset.present? ? version.changeset.each { |_k, v| v[0] } : ''
new_data_value = version.changeset.present? ? version.changeset.each { |_k, v| v[1] } : ''
csv << [version.created_at,
version.whodunnit,
old_data_value,
new_data_value]
end
end
end
但是,我在两列中都得到了相同的数据,而不是漂亮的日志:
在 old_data 列中:
{"name"=>["", "no name"], "is_initial_survey_filled"=>[false, true], "updated_at"=>[Mon, 31 Aug 2020 20:31:45 UTC +00:00, Mon, 31 Aug 2020 23:43:17 UTC +00:00]}
在列 new_data
{"name"=>["", "no name"], "is_initial_survey_filled"=>[false, true], "updated_at"=>[Mon, 31 Aug 2020 20:31:45 UTC +00:00, Mon, 31 Aug 2020 23:43:17 UTC +00:00]}
[编辑]
所需的 CSV 应如下所示:
