diff --git a/app/models/concerns/has_custom_fields.rb b/app/models/concerns/has_custom_fields.rb index 91adb97caf..16d9872344 100644 --- a/app/models/concerns/has_custom_fields.rb +++ b/app/models/concerns/has_custom_fields.rb @@ -301,7 +301,7 @@ protected self.class.append_custom_field(target, key, value) end @custom_fields_orig = target - @custom_fields = @custom_fields_orig.dup + @custom_fields = @custom_fields_orig.deep_dup end end diff --git a/spec/lib/concern/has_custom_fields_spec.rb b/spec/lib/concern/has_custom_fields_spec.rb index 54154a3030..0a8616bd3c 100644 --- a/spec/lib/concern/has_custom_fields_spec.rb +++ b/spec/lib/concern/has_custom_fields_spec.rb @@ -307,6 +307,35 @@ describe HasCustomFields do expect(test_item.reload.custom_fields).to eq(expected) end + it 'determines clean state correctly for mutable fields' do + json_field = "json_field" + array_field = "array_field" + CustomFieldsTestItem.register_custom_field_type(json_field, :json) + CustomFieldsTestItem.register_custom_field_type(array_field, :array) + + item_with_array = CustomFieldsTestItem.new + expect(item_with_array.custom_fields_clean?).to eq(true) + item_with_array.custom_fields[array_field] = [1] + expect(item_with_array.custom_fields_clean?).to eq(false) + item_with_array.save! + expect(item_with_array.custom_fields_clean?).to eq(true) + item_with_array.custom_fields[array_field] << 2 + expect(item_with_array.custom_fields_clean?).to eq(false) + item_with_array.save! + expect(item_with_array.custom_fields_clean?).to eq(true) + + item_with_json = CustomFieldsTestItem.new + expect(item_with_json.custom_fields_clean?).to eq(true) + item_with_json.custom_fields[json_field] = { "hello" => "world" } + expect(item_with_json.custom_fields_clean?).to eq(false) + item_with_json.save! + expect(item_with_json.custom_fields_clean?).to eq(true) + item_with_json.custom_fields[json_field]["hello"] = "world2" + expect(item_with_json.custom_fields_clean?).to eq(false) + item_with_json.save! + expect(item_with_json.custom_fields_clean?).to eq(true) + end + describe "create_singular" do it "creates new records" do item = CustomFieldsTestItem.create!