提交 d075c843 编写于 作者: Y Yves Senn

Merge pull request #15307 from sgrif/sg-type-cast-for-write

Add an interface for type objects to control Ruby => SQL
...@@ -65,6 +65,8 @@ def serialize(attr_name, class_name_or_coder = Object) ...@@ -65,6 +65,8 @@ def serialize(attr_name, class_name_or_coder = Object)
end end
class Type # :nodoc: class Type # :nodoc:
delegate :type, :type_cast_for_database, to: :@column
def initialize(column) def initialize(column)
@column = column @column = column
end end
...@@ -77,10 +79,6 @@ def type_cast(value) ...@@ -77,10 +79,6 @@ def type_cast(value)
end end
end end
def type
@column.type
end
def accessor def accessor
ActiveRecord::Store::IndifferentHashAccessor ActiveRecord::Store::IndifferentHashAccessor
end end
......
...@@ -2,6 +2,8 @@ module ActiveRecord ...@@ -2,6 +2,8 @@ module ActiveRecord
module AttributeMethods module AttributeMethods
module TimeZoneConversion module TimeZoneConversion
class Type # :nodoc: class Type # :nodoc:
delegate :type, :type_cast_for_database, to: :@column
def initialize(column) def initialize(column)
@column = column @column = column
end end
...@@ -10,10 +12,6 @@ def type_cast(value) ...@@ -10,10 +12,6 @@ def type_cast(value)
value = @column.type_cast(value) value = @column.type_cast(value)
value.acts_like?(:time) ? value.in_time_zone : value value.acts_like?(:time) ? value.in_time_zone : value
end end
def type
@column.type
end
end end
extend ActiveSupport::Concern extend ActiveSupport::Concern
......
...@@ -47,6 +47,15 @@ def type_cast(value, column) ...@@ -47,6 +47,15 @@ def type_cast(value, column)
return value.id return value.id
end end
# FIXME: The only case we get an object other than nil or a real column
# is `SchemaStatements#add_column` with a PG array that has a non-empty default
# value. Is this really the only case? Are we missing tests for other types?
# We should have a real column object passed (or nil) here, and check for that
# instead
if column.respond_to?(:type_cast_for_database)
value = column.type_cast_for_database(value)
end
case value case value
when String, ActiveSupport::Multibyte::Chars when String, ActiveSupport::Multibyte::Chars
value = value.to_s value = value.to_s
......
...@@ -18,7 +18,8 @@ module Format ...@@ -18,7 +18,8 @@ module Format
alias :encoded? :coder alias :encoded? :coder
delegate :type, :precision, :scale, :limit, :klass, :text?, :number?, :binary?, :type_cast_for_write, to: :cast_type delegate :type, :precision, :scale, :limit, :klass, :text?, :number?, :binary?,
:type_cast_for_write, :type_cast_for_database, to: :cast_type
# Instantiates a new column in the table. # Instantiates a new column in the table.
# #
......
...@@ -21,6 +21,10 @@ def type_cast_for_write(value) ...@@ -21,6 +21,10 @@ def type_cast_for_write(value)
value value
end end
def type_cast_for_database(value)
type_cast_for_write(value)
end
def text? def text?
false false
end end
......
...@@ -122,7 +122,6 @@ def test_composite_mapping ...@@ -122,7 +122,6 @@ def test_composite_mapping
assert_equal "Champs-Élysées", composite.address.street assert_equal "Champs-Élysées", composite.address.street
composite.address = FullAddress.new("Paris", "Rue Basse") composite.address = FullAddress.new("Paris", "Rue Basse")
skip "Saving with custom OID type is currently not supported."
composite.save! composite.save!
assert_equal 'Paris', composite.reload.address.city assert_equal 'Paris', composite.reload.address.city
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册