madeintandem / jsonb_accessor

Adds typed jsonb backed fields to your ActiveRecord models.
MIT License
1.11k stars 93 forks source link

Add Rails true enum support #163

Closed bgvo closed 1 year ago

bgvo commented 1 year ago

I first found this thread and gave Rails enum a shot. It "seemed" to work, but it only did for String mappings. Even if enum was defined, when assigning attributes, jsonb_accessor would update the jsonb with the value from the public getter, which returns the corresponding enum key (whatever that is) and not the actual value that should be stored in the database.

This was first noticed by kg-currenxie.

Example

Given:

jsonb_accessor :data, my_enum_attribute: :integer
enum my_enum_attribute: { "Foo" => 1, "Bar" => 2 }

MyClass.create(my_enum_attribute: "Foo") will store a jsonb with "Foo" as value instead of 1.

With the introduced changes, the actual value stored will be 1.

The use of enums with integers allows a ton of flexibility when it comes to altering existing enum keys. I'm in the middle of a migration and having enums defined with integers instead of strings makes things much easier.

bgvo commented 1 year ago

I didn't have time to add documentation just yet. Happy to do it if the PR looks good.

haffla commented 1 year ago

@bgvo thanks. This looks great. Can you fix the lint issues. Then let's see if all tests are green.

bgvo commented 1 year ago

@haffla Thank you for the excellent work. Lint issue fixed!

haffla commented 1 year ago

@bgvo can you please remove the change in the schema.rb? It seems to break the test suite and is unrelated to this PR.

bgvo commented 1 year ago

@haffla Done. Sorry about that.