From bd0d47eed6d88184cd9209b12f853f06b15de48a Mon Sep 17 00:00:00 2001 From: Miklos Fazkeas Date: Tue, 9 Dec 2014 15:20:22 +0100 Subject: Fix ProtocolViolation/bind message supplies for polymorphic + pluck or group --- .../lib/active_record/relation/calculations.rb | 4 ++-- activerecord/test/cases/calculations_test.rb | 24 ++++++++++++++++++++++ 2 files changed, 26 insertions(+), 2 deletions(-) (limited to 'activerecord') diff --git a/activerecord/lib/active_record/relation/calculations.rb b/activerecord/lib/active_record/relation/calculations.rb index c8ebb41131..71673324eb 100644 --- a/activerecord/lib/active_record/relation/calculations.rb +++ b/activerecord/lib/active_record/relation/calculations.rb @@ -177,7 +177,7 @@ module ActiveRecord relation.select_values = column_names.map { |cn| columns_hash.key?(cn) ? arel_table[cn] : cn } - result = klass.connection.select_all(relation.arel, nil, bind_values) + result = klass.connection.select_all(relation.arel, nil, relation.arel.bind_values + bind_values) result.cast_values(klass.column_types) end end @@ -317,7 +317,7 @@ module ActiveRecord relation.group_values = group relation.select_values = select_values - calculated_data = @klass.connection.select_all(relation, nil, bind_values) + calculated_data = @klass.connection.select_all(relation, nil, relation.arel.bind_values + bind_values) if association key_ids = calculated_data.collect { |row| row[group_aliases.first] } diff --git a/activerecord/test/cases/calculations_test.rb b/activerecord/test/cases/calculations_test.rb index e886268a72..1264251418 100644 --- a/activerecord/test/cases/calculations_test.rb +++ b/activerecord/test/cases/calculations_test.rb @@ -10,6 +10,7 @@ require 'models/reply' require 'models/minivan' require 'models/speedometer' require 'models/ship_part' +require 'models/treasure' class NumericData < ActiveRecord::Base self.table_name = 'numeric_data' @@ -609,4 +610,27 @@ class CalculationsTest < ActiveRecord::TestCase .pluck('topics.title', 'replies_topics.title') assert_equal expected, actual end + + def test_calculation_with_polymorphic_relation + sp = ShipPart.create! name: "no trinket" + sp_with_trinket = ShipPart.create! name: "has_trinket" + sp_with_trinket.trinkets.create! + ship_parts = [sp.id,sp_with_trinket.id] + + sp_with_trinket_relation = ShipPart.where(id:ship_parts).joins(:trinkets) + sp_with_trinket_relation2 = sp_with_trinket_relation.where(name:"has_trinket") + sp_with_trinket_relation3 = sp_with_trinket_relation.where(treasures: {looter_type:"ShipPart"}) + sp_with_trinket_relation4 = ShipPart.where(id:ship_parts).eager_load(:trinkets).where.not(treasures:{id:nil}) + + [sp_with_trinket_relation,sp_with_trinket_relation2, + sp_with_trinket_relation3,sp_with_trinket_relation4].each do |with_trinket_rel| + assert_equal 1, with_trinket_rel.count + assert_equal [sp_with_trinket.id], with_trinket_rel.pluck(:id) + assert_equal sp_with_trinket.id, with_trinket_rel.sum(:id) + assert_equal ({"has_trinket" => sp_with_trinket.id}), with_trinket_rel.group('ship_parts.name').sum(:id) + assert_equal ({"has_trinket" => sp_with_trinket.id}), with_trinket_rel.where(id:sp_with_trinket.id). + group('ship_parts.name').sum(:id) + end + end + end -- cgit v1.2.3