diff options
author | Andrew White <pixeltrix@users.noreply.github.com> | 2017-04-14 15:41:14 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-04-14 15:41:14 +0100 |
commit | 5e22cd3c76ca03b7a954556f636bdc28b976275d (patch) | |
tree | 5ae55d1c9670d6f02c2d34d80bc52be886a13c25 /activerecord/lib/active_record/relation/predicate_builder.rb | |
parent | 6664f8dd791fcc14c0e0a1c82e41d35811add717 (diff) | |
parent | eae0ab97b2f8fdb3f7d62fa14642c54421edc4ff (diff) | |
download | rails-5e22cd3c76ca03b7a954556f636bdc28b976275d.tar.gz rails-5e22cd3c76ca03b7a954556f636bdc28b976275d.tar.bz2 rails-5e22cd3c76ca03b7a954556f636bdc28b976275d.zip |
Merge pull request #28715 from kamipo/convert_association_queries_to_poro_queries
Convert association queries to PORO queries
Diffstat (limited to 'activerecord/lib/active_record/relation/predicate_builder.rb')
-rw-r--r-- | activerecord/lib/active_record/relation/predicate_builder.rb | 21 |
1 files changed, 17 insertions, 4 deletions
diff --git a/activerecord/lib/active_record/relation/predicate_builder.rb b/activerecord/lib/active_record/relation/predicate_builder.rb index fca914aedd..133b3d837c 100644 --- a/activerecord/lib/active_record/relation/predicate_builder.rb +++ b/activerecord/lib/active_record/relation/predicate_builder.rb @@ -20,8 +20,6 @@ module ActiveRecord register_handler(RangeHandler::RangeWithBinds, RangeHandler.new) register_handler(Relation, RelationHandler.new) register_handler(Array, ArrayHandler.new(self)) - register_handler(AssociationQueryValue, AssociationQueryHandler.new(self)) - register_handler(PolymorphicArrayValue, PolymorphicArrayHandler.new(self)) end def build_from_hash(attributes) @@ -87,7 +85,6 @@ module ActiveRecord binds = [] attributes.each do |column_name, value| - binds.concat(value.bound_attributes) if value.is_a?(Relation) case when value.is_a?(Hash) && !table.has_column?(column_name) attrs, bvs = associated_predicate_builder(column_name).create_binds_for_hash(value) @@ -99,7 +96,21 @@ module ActiveRecord # # For polymorphic relationships, find the foreign key and type: # PriceEstimate.where(estimate_of: treasure) - result[column_name] = AssociationQueryHandler.value_for(table, column_name, value) + associated_table = table.associated_table(column_name) + if associated_table.polymorphic_association? + case value.is_a?(Array) ? value.first : value + when Base, Relation + value = [value] unless value.is_a?(Array) + klass = PolymorphicArrayValue + end + end + + klass ||= AssociationQueryValue + result[column_name] = klass.new(associated_table, value).queries.map do |query| + attrs, bvs = create_binds_for_hash(query) + binds.concat(bvs) + attrs + end when value.is_a?(Range) && !table.type(column_name).respond_to?(:subtype) first = value.begin last = value.end @@ -117,6 +128,8 @@ module ActiveRecord if can_be_bound?(column_name, value) result[column_name] = Arel::Nodes::BindParam.new binds << build_bind_param(column_name, value) + elsif value.is_a?(Relation) + binds.concat(value.bound_attributes) end end end |