未验证 提交 439145c9 编写于 作者: R Ryuta Kamizono 提交者: GitHub

Merge pull request #36314 from kamipo/fallback_type_casting

Fall back to type casting from the connection adapter
......@@ -4,8 +4,9 @@ module ActiveRecord
class TableMetadata # :nodoc:
delegate :foreign_type, :foreign_key, :join_primary_key, :join_foreign_key, to: :association, prefix: true
def initialize(klass, arel_table, association = nil)
def initialize(klass, arel_table, association = nil, types = klass)
@klass = klass
@types = types
@arel_table = arel_table
@association = association
end
......@@ -29,11 +30,7 @@ def arel_attribute(column_name)
end
def type(column_name)
if klass
klass.type_for_attribute(column_name)
else
Type.default_value
end
types.type_for_attribute(column_name)
end
def has_column?(column_name)
......@@ -52,13 +49,12 @@ def associated_table(table_name)
elsif association && !association.polymorphic?
association_klass = association.klass
arel_table = association_klass.arel_table.alias(table_name)
TableMetadata.new(association_klass, arel_table, association)
else
type_caster = TypeCaster::Connection.new(klass, table_name)
association_klass = nil
arel_table = Arel::Table.new(table_name, type_caster: type_caster)
TableMetadata.new(nil, arel_table, association, type_caster)
end
TableMetadata.new(association_klass, arel_table, association)
end
def polymorphic_association?
......@@ -74,6 +70,6 @@ def reflect_on_aggregation(aggregation_name)
end
private
attr_reader :klass, :arel_table, :association
attr_reader :klass, :types, :arel_table, :association
end
end
......@@ -8,21 +8,27 @@ def initialize(klass, table_name)
@table_name = table_name
end
def type_cast_for_database(attribute_name, value)
def type_cast_for_database(attr_name, value)
return value if value.is_a?(Arel::Nodes::BindParam)
column = column_for(attribute_name)
connection.type_cast_from_column(column, value)
type = type_for_attribute(attr_name)
type.serialize(value)
end
private
attr_reader :table_name
delegate :connection, to: :@klass
def type_for_attribute(attr_name)
schema_cache = connection.schema_cache
def column_for(attribute_name)
if connection.schema_cache.data_source_exists?(table_name)
connection.schema_cache.columns_hash(table_name)[attribute_name.to_s]
end
if schema_cache.data_source_exists?(table_name)
column = schema_cache.columns_hash(table_name)[attr_name.to_s]
type = connection.lookup_cast_type_from_column(column) if column
end
type || Type.default_value
end
delegate :connection, to: :@klass, private: true
private
attr_reader :table_name
end
end
end
......@@ -18,7 +18,7 @@
module ActiveRecord
class WhereTest < ActiveRecord::TestCase
fixtures :posts, :edges, :authors, :author_addresses, :binaries, :essays, :cars, :treasures, :price_estimates, :topics
fixtures :posts, :comments, :edges, :authors, :author_addresses, :binaries, :essays, :cars, :treasures, :price_estimates, :topics
def test_in_clause_is_correctly_sliced
assert_called(Author.connection, :in_clause_length, returns: 1) do
......@@ -27,6 +27,11 @@ def test_in_clause_is_correctly_sliced
end
end
def test_type_casting_nested_joins
comment = comments(:eager_other_comment1)
assert_equal [comment], Comment.joins(post: :author).where(authors: { id: "2-foo" })
end
def test_where_copies_bind_params
author = authors(:david)
posts = author.posts.where("posts.id != 1")
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册