提交 fb8ac4f7 编写于 作者: S Sean Griffin

Use the type object for sending JSON to the database

上级 9ca0f8da
......@@ -34,28 +34,12 @@ def string_to_hstore(string) # :nodoc:
end
end
def json_to_string(object) # :nodoc:
if Hash === object || Array === object
ActiveSupport::JSON.encode(object)
else
object
end
end
def range_to_string(object) # :nodoc:
from = object.begin.respond_to?(:infinite?) && object.begin.infinite? ? '' : object.begin
to = object.end.respond_to?(:infinite?) && object.end.infinite? ? '' : object.end
"[#{from},#{to}#{object.exclude_end? ? ')' : ']'}"
end
def string_to_json(string) # :nodoc:
if String === string
ActiveSupport::JSON.decode(string)
else
string
end
end
private
HstorePair = begin
......
......@@ -10,11 +10,19 @@ def type
end
def type_cast_from_database(value)
ConnectionAdapters::PostgreSQLColumn.string_to_json(value)
if value.is_a?(::String)
::ActiveSupport::JSON.decode(value)
else
super
end
end
def type_cast_for_database(value)
ConnectionAdapters::PostgreSQLColumn.json_to_string(value)
if value.is_a?(::Array) || value.is_a?(::Hash)
::ActiveSupport::JSON.encode(value)
else
super
end
end
def accessor
......
......@@ -30,14 +30,12 @@ def quote(value, column = nil) #:nodoc:
when Array
case sql_type
when 'point' then super(PostgreSQLColumn.point_to_string(value))
when 'json' then super(PostgreSQLColumn.json_to_string(value))
else
super(value, array_column(column))
end
when Hash
case sql_type
when 'hstore' then super(PostgreSQLColumn.hstore_to_string(value), column)
when 'json' then super(PostgreSQLColumn.json_to_string(value), column)
else super
end
when Float
......@@ -92,14 +90,12 @@ def type_cast(value, column, array_member = false)
when Array
case column.sql_type
when 'point' then PostgreSQLColumn.point_to_string(value)
when 'json' then PostgreSQLColumn.json_to_string(value)
else
super(value, array_column(column))
end
when Hash
case column.sql_type
when 'hstore' then PostgreSQLColumn.hstore_to_string(value, array_member)
when 'json' then PostgreSQLColumn.json_to_string(value)
else super(value, column)
end
else
......
......@@ -77,7 +77,7 @@ def test_type_cast_json
column = JsonDataType.columns_hash["payload"]
data = "{\"a_key\":\"a_value\"}"
hash = column.class.string_to_json data
hash = column.type_cast_from_database(data)
assert_equal({'a_key' => 'a_value'}, hash)
assert_equal({'a_key' => 'a_value'}, column.type_cast_from_database(data))
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册