提交 e5abb89c 编写于 作者: C Carlos Antonio da Silva

Ensure Arel columns are typecasted properly when grouping with calculation

Fix build issue with postgresql.
上级 07875be9
......@@ -265,9 +265,9 @@ def execute_grouped_calculation(operation, column_name, distinct) #:nodoc:
group_attrs = group_values
if group_attrs.first.respond_to?(:to_sym)
association = @klass.reflect_on_association(group_attrs.first.to_sym)
associated = group_attrs.size == 1 && association && association.macro == :belongs_to # only count belongs_to associations
group_fields = Array(associated ? association.foreign_key : group_attrs)
association = @klass.reflect_on_association(group_attrs.first.to_sym)
associated = group_attrs.size == 1 && association && association.macro == :belongs_to # only count belongs_to associations
group_fields = Array(associated ? association.foreign_key : group_attrs)
else
group_fields = group_attrs
end
......@@ -313,10 +313,10 @@ def execute_grouped_calculation(operation, column_name, distinct) #:nodoc:
end
Hash[calculated_data.map do |row|
key = group_columns.map { |aliaz, column|
key = group_columns.map { |aliaz, column|
type_cast_calculated_value(row[aliaz], column)
}
key = key.first if key.size == 1
key = key.first if key.size == 1
key = key_records[key] if associated
[key, type_cast_calculated_value(row[aggregate_alias], column_for(column_name), operation)]
end]
......@@ -343,7 +343,7 @@ def column_alias_for(*keys)
end
def column_for(field)
field_name = field.to_s.split('.').last
field_name = field.respond_to?(:name) ? field.name.to_s : field.to_s.split('.').last
@klass.columns.detect { |c| c.name.to_s == field_name }
end
......
......@@ -58,12 +58,16 @@ def test_should_get_minimum_of_field
def test_should_group_by_field
c = Account.group(:firm_id).sum(:credit_limit)
[1,6,2].each { |firm_id| assert c.keys.include?(firm_id) }
[1,6,2].each do |firm_id|
assert c.keys.include?(firm_id), "Group #{c.inspect} does not contain firm_id #{firm_id}"
end
end
def test_should_group_by_arel_attribute
c = Account.sum(:credit_limit, :group => Account.arel_table[:firm_id])
[1,6,2].each { |firm_id| assert c.keys.include?(firm_id) }
c = Account.group(Account.arel_table[:firm_id]).sum(:credit_limit)
[1,6,2].each do |firm_id|
assert c.keys.include?(firm_id), "Group #{c.inspect} does not contain firm_id #{firm_id}"
end
end
def test_should_group_by_multiple_fields
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册