aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib/active_record/relation
diff options
context:
space:
mode:
Diffstat (limited to 'activerecord/lib/active_record/relation')
-rw-r--r--activerecord/lib/active_record/relation/finder_methods.rb13
-rw-r--r--activerecord/lib/active_record/relation/query_methods.rb19
-rw-r--r--activerecord/lib/active_record/relation/spawn_methods.rb36
3 files changed, 30 insertions, 38 deletions
diff --git a/activerecord/lib/active_record/relation/finder_methods.rb b/activerecord/lib/active_record/relation/finder_methods.rb
index d6d3d66642..c1cce679b6 100644
--- a/activerecord/lib/active_record/relation/finder_methods.rb
+++ b/activerecord/lib/active_record/relation/finder_methods.rb
@@ -175,7 +175,7 @@ module ActiveRecord
end
def construct_relation_for_association_find(join_dependency)
- relation = except(:includes, :eager_load, :preload, :select).select(@klass.send(:column_aliases, join_dependency))
+ relation = except(:includes, :eager_load, :preload, :select).select(column_aliases(join_dependency))
apply_join_dependency(relation, join_dependency)
end
@@ -184,7 +184,7 @@ module ActiveRecord
relation = association.join_relation(relation)
end
- limitable_reflections = @klass.send(:using_limitable_reflections?, join_dependency.reflections)
+ limitable_reflections = using_limitable_reflections?(join_dependency.reflections)
if !limitable_reflections && relation.limit_value
limited_id_condition = construct_limited_ids_condition(relation.except(:select))
@@ -311,5 +311,14 @@ module ActiveRecord
end
end
+ def column_aliases(join_dependency)
+ join_dependency.joins.collect{|join| join.column_names_with_alias.collect{|column_name, aliased_name|
+ "#{connection.quote_table_name join.aliased_table_name}.#{connection.quote_column_name column_name} AS #{aliased_name}"}}.flatten.join(", ")
+ end
+
+ def using_limitable_reflections?(reflections)
+ reflections.collect(&:collection?).length.zero?
+ end
+
end
end
diff --git a/activerecord/lib/active_record/relation/query_methods.rb b/activerecord/lib/active_record/relation/query_methods.rb
index e00d9cdf27..0250e739b8 100644
--- a/activerecord/lib/active_record/relation/query_methods.rb
+++ b/activerecord/lib/active_record/relation/query_methods.rb
@@ -6,6 +6,7 @@ module ActiveRecord
(ActiveRecord::Relation::ASSOCIATION_METHODS + ActiveRecord::Relation::MULTI_VALUE_METHODS).each do |query_method|
attr_accessor :"#{query_method}_values"
+ next if [:where, :having].include?(query_method)
class_eval <<-CEVAL
def #{query_method}(*args)
new_relation = clone
@@ -133,13 +134,8 @@ module ActiveRecord
arel = h.is_a?(String) ? arel.having(h) : arel.having(*h)
end
- if defined?(@limit_value) && @limit_value.present?
- arel = arel.take(@limit_value)
- end
-
- if defined?(@offset_value) && @offset_value.present?
- arel = arel.skip(@offset_value)
- end
+ arel = arel.take(@limit_value) if @limit_value.present?
+ arel = arel.skip(@offset_value) if @offset_value.present?
@group_values.uniq.each do |g|
arel = arel.group(g) if g.present?
@@ -162,19 +158,14 @@ module ActiveRecord
arel = arel.project(quoted_table_name + '.*')
end
- arel =
- if defined?(@from_value) && @from_value.present?
- arel.from(@from_value)
- else
- arel.from(quoted_table_name)
- end
+ arel = @from_value.present? ? arel.from(@from_value) : arel.from(quoted_table_name)
case @lock_value
when TrueClass
arel = arel.lock
when String
arel = arel.lock(@lock_value)
- end if defined?(@lock_value)
+ end if @lock_value.present?
arel
end
diff --git a/activerecord/lib/active_record/relation/spawn_methods.rb b/activerecord/lib/active_record/relation/spawn_methods.rb
index a18380f01c..2841ff1239 100644
--- a/activerecord/lib/active_record/relation/spawn_methods.rb
+++ b/activerecord/lib/active_record/relation/spawn_methods.rb
@@ -4,30 +4,14 @@ module ActiveRecord
merged_relation = clone
return merged_relation unless r
- merged_relation = merged_relation.eager_load(r.eager_load_values).preload(r.preload_values).includes(r.includes_values)
-
- merged_relation.readonly_value = r.readonly_value unless r.readonly_value.nil?
- merged_relation.limit_value = r.limit_value if r.limit_value.present?
- merged_relation.lock_value = r.lock_value unless merged_relation.lock_value
- merged_relation.offset_value = r.offset_value if r.offset_value.present?
-
- merged_relation = merged_relation.
- joins(r.joins_values).
- group(r.group_values).
- select(r.select_values).
- from(r.from_value).
- having(r.having_values)
-
- merged_relation.order_values = r.order_values if r.order_values.present?
-
- merged_relation.create_with_value = @create_with_value
-
- if @create_with_value && r.create_with_value
- merged_relation.create_with_value = @create_with_value.merge(r.create_with_value)
- else
- merged_relation.create_with_value = r.create_with_value || @create_with_value
+ (ActiveRecord::Relation::ASSOCIATION_METHODS + ActiveRecord::Relation::MULTI_VALUE_METHODS).reject {|m| [:joins, :where].include?(m)}.each do |method|
+ unless (value = r.send(:"#{method}_values")).blank?
+ merged_relation.send(:"#{method}_values=", value)
+ end
end
+ merged_relation = merged_relation.joins(r.joins_values)
+
merged_wheres = @where_values
r.where_values.each do |w|
@@ -40,6 +24,14 @@ module ActiveRecord
merged_relation.where_values = merged_wheres
+ ActiveRecord::Relation::SINGLE_VALUE_METHODS.reject {|m| m == :lock}.each do |method|
+ unless (value = r.send(:"#{method}_value")).nil?
+ merged_relation.send(:"#{method}_value=", value)
+ end
+ end
+
+ merged_relation.lock_value = r.lock_value unless merged_relation.lock_value
+
merged_relation
end