0

在我的 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 应如下所示:

在附图中

4

1 回答 1

0

只需使用map方法而不是each. each总是返回调用它的集合。map将从传递给它的块返回数据。更改version.changeset.each { |_k, v| v[0] } : ''version.changeset.map { |_k, v| v[0] } : ''将完成工作。

编辑:刚刚意识到你想要哈希而不是数组。version.changeset.map { |k, v| [k, v[0]] }.to_h : ''将完成这项工作。

于 2020-09-01T10:23:45.940 回答