提交 a89d20cf 编写于 作者: R Ryuta Kamizono

Type cast aggregations values for table name unqalified column in joins tables

Follow up of #39292 and #39259.
上级 31062c9d
...@@ -308,11 +308,10 @@ def execute_simple_calculation(operation, column_name, distinct) #:nodoc: ...@@ -308,11 +308,10 @@ def execute_simple_calculation(operation, column_name, distinct) #:nodoc:
result = skip_query_cache_if_necessary { @klass.connection.select_all(query_builder) } result = skip_query_cache_if_necessary { @klass.connection.select_all(query_builder) }
type_cast_calculated_value(result.cast_values.first, operation) do |value| type_cast_calculated_value(result.cast_values.first, operation) do |value|
if type = column.try(:type_caster) || klass.attribute_types[column_name.to_s] type = column.try(:type_caster) || klass.attribute_types.fetch(name = column_name.to_s) do
type.deserialize(value) lookup_cast_type_from_join_dependencies(name, build_join_dependencies) || Type.default_value
else
value
end end
type.deserialize(value)
end end
end end
...@@ -379,11 +378,10 @@ def execute_grouped_calculation(operation, column_name, distinct) #:nodoc: ...@@ -379,11 +378,10 @@ def execute_grouped_calculation(operation, column_name, distinct) #:nodoc:
key = key_records[key] if associated key = key_records[key] if associated
result[key] = type_cast_calculated_value(row[column_alias], operation) do |value| result[key] = type_cast_calculated_value(row[column_alias], operation) do |value|
if type ||= column.try(:type_caster) || klass.attribute_types[column_name.to_s] type ||= column.try(:type_caster) || klass.attribute_types.fetch(name = column_name.to_s) do
type.deserialize(value) lookup_cast_type_from_join_dependencies(name, build_join_dependencies) || Type.default_value
else
value
end end
type.deserialize(value)
end end
end end
end end
......
...@@ -1159,11 +1159,17 @@ def assert_minimum_and_maximum_on_time_attributes(time_class) ...@@ -1159,11 +1159,17 @@ def assert_minimum_and_maximum_on_time_attributes(time_class)
assert_instance_of time_class, actual[true] assert_instance_of time_class, actual[true]
assert_instance_of time_class, actual[true] assert_instance_of time_class, actual[true]
actual = Author.joins(:topics).maximum(:"topics.written_on") assert_minimum_and_maximum_on_time_attributes_joins_with_column(time_class, :"topics.written_on")
assert_minimum_and_maximum_on_time_attributes_joins_with_column(time_class, :written_on)
end
private :assert_minimum_and_maximum_on_time_attributes
def assert_minimum_and_maximum_on_time_attributes_joins_with_column(time_class, column)
actual = Author.joins(:topics).maximum(column)
assert_equal Time.utc(2004, 7, 15, 14, 28, 0, 9900), actual assert_equal Time.utc(2004, 7, 15, 14, 28, 0, 9900), actual
assert_instance_of time_class, actual assert_instance_of time_class, actual
actual = Author.joins(:topics).minimum(:"topics.written_on") actual = Author.joins(:topics).minimum(column)
assert_equal Time.utc(2003, 7, 16, 14, 28, 11, 223300), actual assert_equal Time.utc(2003, 7, 16, 14, 28, 11, 223300), actual
assert_instance_of time_class, actual assert_instance_of time_class, actual
...@@ -1172,17 +1178,17 @@ def assert_minimum_and_maximum_on_time_attributes(time_class) ...@@ -1172,17 +1178,17 @@ def assert_minimum_and_maximum_on_time_attributes(time_class)
2 => Time.utc(2004, 7, 15, 14, 28, 0, 9900), 2 => Time.utc(2004, 7, 15, 14, 28, 0, 9900),
} }
actual = Author.joins(:topics).group(:id).maximum(:"topics.written_on") actual = Author.joins(:topics).group(:id).maximum(column)
assert_equal expected, actual assert_equal expected, actual
assert_instance_of time_class, actual[1] assert_instance_of time_class, actual[1]
assert_instance_of time_class, actual[2] assert_instance_of time_class, actual[2]
actual = Author.joins(:topics).group(:id).minimum(:"topics.written_on") actual = Author.joins(:topics).group(:id).minimum(column)
assert_equal expected, actual assert_equal expected, actual
assert_instance_of time_class, actual[1] assert_instance_of time_class, actual[1]
assert_instance_of time_class, actual[2] assert_instance_of time_class, actual[2]
end end
private :assert_minimum_and_maximum_on_time_attributes private :assert_minimum_and_maximum_on_time_attributes_joins_with_column
def test_select_avg_with_group_by_as_virtual_attribute_with_sql def test_select_avg_with_group_by_as_virtual_attribute_with_sql
rails_core = companies(:rails_core) rails_core = companies(:rails_core)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册