提交 978b3d60 编写于 作者: S Sean Griffin 提交者: GitHub

Merge pull request #29520 from kirs/serialize-vs-postgres-native-column

Do not let use `serialize` on native JSON/array column
......@@ -5,6 +5,16 @@ module AttributeMethods
module Serialization
extend ActiveSupport::Concern
class ColumnNotSerializableError < StandardError
def initialize(name, type)
super <<-EOS.strip_heredoc
Column `#{name}` of type #{type.class} does not support `serialize` feature.
Usually it means that you are trying to use `serialize`
on a column that already implements serialization natively.
EOS
end
end
module ClassMethods
# If you have an attribute that needs to be saved to the database as an
# object, and retrieved as the same object, then specify the name of that
......@@ -60,9 +70,23 @@ def serialize(attr_name, class_name_or_coder = Object)
end
decorate_attribute_type(attr_name, :serialize) do |type|
if type_incompatible_with_serialize?(type)
raise ColumnNotSerializableError.new(attr_name, type)
end
Type::Serialized.new(type, coder)
end
end
private
def type_incompatible_with_serialize?(type)
type.is_a?(ActiveRecord::Type::Json) ||
(
defined?(ActiveRecord::ConnectionAdapters::PostgreSQL) &&
type.is_a?(ActiveRecord::ConnectionAdapters::PostgreSQL::OID::Array)
)
end
end
end
end
......
......@@ -47,6 +47,15 @@ def test_column
assert ratings_column.array?
end
def test_not_compatible_with_serialize
new_klass = Class.new(PgArray) do
serialize :tags, Array
end
assert_raises(ActiveRecord::AttributeMethods::Serialization::ColumnNotSerializableError) do
new_klass.new
end
end
def test_default
@connection.add_column "pg_arrays", "score", :integer, array: true, default: [4, 4, 2]
PgArray.reset_column_information
......
......@@ -33,6 +33,15 @@ def test_deserialize_with_array
x.reload
assert_equal ["foo" => "bar"], x.objects
end
def test_not_compatible_with_serialize_macro
new_klass = Class.new(klass) do
serialize :payload, JSON
end
assert_raises(ActiveRecord::AttributeMethods::Serialization::ColumnNotSerializableError) do
new_klass.new
end
end
end
class PostgresqlJSONTest < ActiveRecord::PostgreSQLTestCase
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册