diff --git a/app/models/concerns/has_custom_fields.rb b/app/models/concerns/has_custom_fields.rb index b33b4fa213e..a2bc01b254d 100644 --- a/app/models/concerns/has_custom_fields.rb +++ b/app/models/concerns/has_custom_fields.rb @@ -6,7 +6,7 @@ module HasCustomFields def self.append_field(target, key, value, types) if target.has_key?(key) target[key] = [target[key]] if !target[key].is_a? Array - target[key] << cast_custom_field(key, value, types) + target[key] << cast_custom_field(key, value, types, _return_array = false) else target[key] = cast_custom_field(key, value, types) end @@ -28,16 +28,26 @@ module HasCustomFields types[key] end - def self.cast_custom_field(key, value, types) + def self.cast_custom_field(key, value, types, return_array = true) return value unless type = get_custom_field_type(types, key) - case type - when :boolean then !!CUSTOM_FIELD_TRUE.include?(value) - when :integer then value.to_i - when :json then ::JSON.parse(value) - else - value + array = nil + + if Array === type + type = type[0] + array = true if return_array end + + result = + case type + when :boolean then !!CUSTOM_FIELD_TRUE.include?(value) + when :integer then value.to_i + when :json then ::JSON.parse(value) + else + value + end + + array ? [result] : result end end diff --git a/spec/components/concern/has_custom_fields_spec.rb b/spec/components/concern/has_custom_fields_spec.rb index 2097583a4a3..035e0260c5a 100644 --- a/spec/components/concern/has_custom_fields_spec.rb +++ b/spec/components/concern/has_custom_fields_spec.rb @@ -98,6 +98,15 @@ describe HasCustomFields do end it "handles arrays properly" do + + CustomFieldsTestItem.register_custom_field_type "array", [:integer] + test_item = CustomFieldsTestItem.new + test_item.custom_fields = { "array" => ["1"] } + test_item.save + + db_item = CustomFieldsTestItem.find(test_item.id) + expect(db_item.custom_fields).to eq("array" => [1]) + test_item = CustomFieldsTestItem.new test_item.custom_fields = { "a" => ["b", "c", "d"] } test_item.save