From 4b41545253676f25bde743df234a7e777565441b Mon Sep 17 00:00:00 2001 From: Borja GVO Date: Thu, 18 May 2023 14:08:19 +0200 Subject: [PATCH] Add Rails true enum support --- lib/jsonb_accessor/macro.rb | 4 +++- spec/jsonb_accessor_spec.rb | 11 ++++++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/lib/jsonb_accessor/macro.rb b/lib/jsonb_accessor/macro.rb index 14a3844..3d751a5 100644 --- a/lib/jsonb_accessor/macro.rb +++ b/lib/jsonb_accessor/macro.rb @@ -66,7 +66,9 @@ def jsonb_accessor(jsonb_attribute, field_types) define_method("#{name}=") do |value| super(value) - attribute_value = public_send(name) + # If enum was defined, take the value from the enum and not what comes out directly from the getter + attribute_value = defined_enums[name].present? ? defined_enums[name][value] : public_send(name) + # Rails always saves time based on `default_timezone`. Since #as_json considers timezone, manual conversion is needed if attribute_value.acts_like?(:time) attribute_value = (JsonbAccessor::Helpers.active_record_default_timezone == :utc ? attribute_value.utc : attribute_value.in_time_zone).strftime("%F %R:%S.%L") diff --git a/spec/jsonb_accessor_spec.rb b/spec/jsonb_accessor_spec.rb index 35e6a82..b474a65 100644 --- a/spec/jsonb_accessor_spec.rb +++ b/spec/jsonb_accessor_spec.rb @@ -17,9 +17,12 @@ def build_class(jsonb_accessor_config, &block) build_class( foo: :string, bar: :integer, + ban: :integer, baz: [:integer, { array: true }], bazzle: [:integer, { default: 5 }] - ) + ) do + enum ban: { foo: 1, bar: 2 } + end end let(:instance) { klass.new } @@ -59,6 +62,12 @@ def build_class(jsonb_accessor_config, &block) expect(instance.bazzle).to eq(5) end + it "supports enums" do + instance.ban = :foo + expect(instance.ban).to eq("foo") + expect(instance.options["ban"]).to eq(1) + end + it "initializes without the jsonb_accessor field selected" do instance.save!