Skip to content

Commit b0dd7c7

Browse files
authored
Merge pull request rails#47482 from Shopify/serialization-default
Serialized attribute should be able to be defined in abstract classes
2 parents 17c5c0d + c4c0b79 commit b0dd7c7

File tree

3 files changed

+12
-46
lines changed

3 files changed

+12
-46
lines changed

activerecord/lib/active_record/attribute_methods/serialization.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,7 @@ def serialize(attr_name, class_name_or_coder = nil, coder: nil, type: Object, ya
219219
end
220220

221221
cast_type = cast_type.subtype if Type::Serialized === cast_type
222-
Type::Serialized.new(cast_type, column_serializer, default: columns_hash[attr_name.to_s]&.default)
222+
Type::Serialized.new(cast_type, column_serializer)
223223
end
224224
end
225225

activerecord/lib/active_record/type/serialized.rb

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,9 @@ class Serialized < DelegateClass(ActiveModel::Type::Value) # :nodoc:
99

1010
attr_reader :subtype, :coder
1111

12-
def initialize(subtype, coder, default: nil)
12+
def initialize(subtype, coder)
1313
@subtype = subtype
1414
@coder = coder
15-
@default = default
1615
super(subtype)
1716
end
1817

@@ -26,7 +25,7 @@ def deserialize(value)
2625

2726
def serialize(value)
2827
return if value.nil?
29-
unless default_value?(value) && @default.nil?
28+
unless default_value?(value)
3029
super coder.dump(value)
3130
end
3231
end

activerecord/test/cases/serialized_attribute_test.rb

Lines changed: 9 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -403,51 +403,18 @@ def test_values_cast_from_nil_are_persisted_as_nil
403403
assert_equal [topic, topic2], Topic.where(content: nil).sort_by(&:id)
404404
end
405405

406-
# MySQL doesn't support default values for text columns, so we need to skip this test for MySQL
407-
if !current_adapter?(:Mysql2Adapter)
408-
def test_serialized_attribute_with_default_can_update_to_default
409-
@verbose_was = ActiveRecord::Migration.verbose
410-
ActiveRecord::Migration.verbose = false
411-
412-
ActiveRecord::Schema.define do
413-
create_table :tmp_posts, force: true do |t|
414-
t.text :content, null: false, default: "{}"
415-
end
416-
end
417-
klass = Class.new(ActiveRecord::Base) do
418-
self.table_name = "tmp_posts"
419-
serialize(:content, type: Hash)
420-
end
421-
422-
t = klass.create!(content: { "other_key" => "new_value" })
423-
assert_equal({ "other_key" => "new_value" }, t.content)
424-
425-
t.update!(content: {})
426-
assert_equal({}, t.content)
427-
ensure
428-
ActiveRecord::Migration.verbose = @verbose_was
406+
def test_serialized_attribute_can_be_defined_in_abstract_classes
407+
klass = Class.new(ActiveRecord::Base) do
408+
self.abstract_class = true
409+
self.table_name = nil
410+
serialize(:content, type: Hash)
429411
end
430412

431-
def test_nil_is_always_persisted_as_default
432-
@verbose_was = ActiveRecord::Migration.verbose
433-
ActiveRecord::Migration.verbose = false
434-
435-
ActiveRecord::Schema.define do
436-
create_table :tmp_posts, force: true do |t|
437-
t.text :content, null: false, default: "{}"
438-
end
439-
end
440-
klass = Class.new(ActiveRecord::Base) do
441-
self.table_name = "tmp_posts"
442-
serialize(:content, type: Hash)
443-
end
444-
445-
t = klass.create!(content: { foo: "bar" })
446-
t.update_attribute :content, nil
447-
assert_equal({}, t.content)
448-
ensure
449-
ActiveRecord::Migration.verbose = @verbose_was
413+
subclass = Class.new(klass) do
414+
self.table_name = "posts"
450415
end
416+
417+
subclass.define_attribute_methods
451418
end
452419

453420
def test_nil_is_always_persisted_as_null

0 commit comments

Comments
 (0)