diff --git a/lib/str_enum/model.rb b/lib/str_enum/model.rb index 57c432e..d836551 100644 --- a/lib/str_enum/model.rb +++ b/lib/str_enum/model.rb @@ -38,7 +38,7 @@ def str_enum(column, values, validate: true, scopes: true, accessor_methods: tru end default_value = default == true ? values.first : default after_initialize do - send("#{column}=", default_value) if has_attribute?(column) && !try(column) + send("#{column}=", default_value) if !persisted? && has_attribute?(column) && !try(column) end define_singleton_method column.to_s.pluralize do values diff --git a/test/str_enum_test.rb b/test/str_enum_test.rb index d7c7191..90c1a62 100644 --- a/test/str_enum_test.rb +++ b/test/str_enum_test.rb @@ -86,4 +86,10 @@ def test_negative_scopes assert_equal 0, User.not_active.count assert_equal 1, User.not_archived.count end + + def test_attr_readonly + user = User.create! + # Should not raise + User.find(user.id) + end end diff --git a/test/test_helper.rb b/test/test_helper.rb index 271bffb..dbade2d 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -4,6 +4,7 @@ require "minitest/pride" require "active_record" +ActiveRecord.raise_on_assign_to_attr_readonly = true ActiveRecord::Base.logger = Logger.new(ENV["VERBOSE"] ? STDOUT : nil) ActiveRecord::Migration.verbose = ENV["VERBOSE"] @@ -15,6 +16,7 @@ t.string :status t.string :address_status t.string :kind + t.string :type end end @@ -22,4 +24,7 @@ class User < ActiveRecord::Base str_enum :status, [:active, :archived] str_enum :address_status, [:active, :archived], prefix: :address str_enum :kind, [:guest, :vip], suffix: true + str_enum :type, [:permanent, :temporary], allow_nil: true, default: nil + + attr_readonly :type end