Paper Trail 保存object_changes内的虚拟属性更改

Paper Trail saving virtual attribute changes within object_changes

提问人:abax 提问时间:1/20/2023 更新时间:1/20/2023 访问量:112

问:

我正在尝试在其中保留虚拟属性更改,并且一直在使用该选项。object_changesmeta

has_paper_trail(
  meta: {
    status_name: proc { |foo| foo.status&.name }
  }
)

正如文档中提到的,我添加到了表中,并且该属性确实得到了持久化。但是,它不是保存在哈希中,而是保存在其单独的列中,并且该值不包括前一个值。status_nameversionsobject_changes

# version attributes:
object_changes:
  "{\"updated_at\":[\"2023-01-18T22:50:22.394Z\",\"2023-01-18T22:50:22.408Z\"],\"status_id\":[1,2]}",
 status_name: "Status 2"

这符合 gem 的预期,但我想将更改推送到并包含以前的值。我能够存储之前和之后更改的一种方法是使用标志创建一个新方法。但它看起来很笨拙,我想知道是否有人有其他选择:status_nameobject_changesmeta

has_paper_trail(
    meta: {
      status_name: :track_status_name_changes
    }
  )

  def track_status_name_changes
    if versions.blank?
      [nil, status&.name].to_json # "[null,\"Status 1\"]"
    else
      prev_name = JSON.parse(versions.last.status_name).last
      [prev_name, status&.name].to_json # "[\"Status 1\",\"Status 2\"]"
    end
  end

我目前正在探索创建自己的适配器,如文档中所述:

PaperTrail.config.object_changes_adapter = MyObjectChangesAdapter.new

class MyObjectChangesAdapter
  # @param changes Hash
  # @return Hash
  def diff(changes)
    # ...
  end
end

使用 meta 标志中的自定义方法,我能够跟踪虚拟属性的更改,但是,我还希望将这些更改存储在版本表的列中。object_changes

Ruby-on-Rails Paper-Trail-gem

评论


答: 暂无答案