mirror of
https://github.com/paper-trail-gem/paper_trail.git
synced 2022-11-09 11:33:19 -05:00
e1f94d4597
Keep consistency between versions with regard to `changes` and `object_changes` and how enum columns store their values. Before, `changes` would map the changed attributes enum columns to the database values (integer values). This allows reifying that version to maintain the integrity of the enum. It did not do so for `object_changes` and thus, `0` for non-json columns, and the enum value for json columns would be stored instead. For the non-json columns, it mapped any non-integer enum value to `0` because during serialization that column is an `integer`. Now this is fixed, so that `object_changes` stores the enum mapped value. Here is an example: ```ruby class PostWithStatus < ActiveRecord::Base has_paper_trail enum status: { draft: 0, published: 1, archived: 2 } end post = PostWithStatus.new(status: :draft) post.published! version = post.versions.last # Before version.changeset #> { 'status' => ['draft', 'draft'] } (stored as [0, 0]) # After version.changeset #> { 'status' => ['draft', 'published'] } (stored as [0, 1]) ```
27 lines
830 B
Ruby
27 lines
830 B
Ruby
require "rails_helper"
|
|
|
|
# This model is in the test suite soley for the purpose of testing ActiveRecord::Enum,
|
|
# which is available in ActiveRecord4+ only
|
|
describe PostWithStatus, type: :model do
|
|
if defined?(ActiveRecord::Enum)
|
|
with_versioning do
|
|
let(:post) { PostWithStatus.create!(status: "draft") }
|
|
|
|
it "should stash the enum value properly in versions" do
|
|
post.published!
|
|
post.archived!
|
|
expect(post.previous_version.published?).to be true
|
|
end
|
|
|
|
context "storing enum object_changes" do
|
|
subject { post.versions.last }
|
|
|
|
it "should stash the enum value properly in versions object_changes" do
|
|
post.published!
|
|
post.archived!
|
|
expect(subject.changeset["status"]).to eql %w(published archived)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|