diff options
author | David Heinemeier Hansson <david@loudthinking.com> | 2009-12-27 14:14:54 -0800 |
---|---|---|
committer | David Heinemeier Hansson <david@loudthinking.com> | 2009-12-27 14:14:54 -0800 |
commit | 9521fcbcc295cb1dd34f7d458c40790466a55244 (patch) | |
tree | 098dc7063b1ae9e92913523004eeac24a3232826 /activerecord/lib | |
parent | 95762cbbb3528bcb6a1a8119795df9647daaaab6 (diff) | |
parent | a0ff5f82c37f312a808dbbdb6191fbf20a750775 (diff) | |
download | rails-9521fcbcc295cb1dd34f7d458c40790466a55244.tar.gz rails-9521fcbcc295cb1dd34f7d458c40790466a55244.tar.bz2 rails-9521fcbcc295cb1dd34f7d458c40790466a55244.zip |
Merge branch 'master' of github.com:rails/rails
Diffstat (limited to 'activerecord/lib')
-rw-r--r-- | activerecord/lib/active_record/relation.rb | 43 |
1 files changed, 26 insertions, 17 deletions
diff --git a/activerecord/lib/active_record/relation.rb b/activerecord/lib/active_record/relation.rb index 4aa460a601..530402bf5d 100644 --- a/activerecord/lib/active_record/relation.rb +++ b/activerecord/lib/active_record/relation.rb @@ -1,8 +1,8 @@ module ActiveRecord class Relation delegate :to_sql, :to => :relation - delegate :length, :collect, :find, :map, :each, :to => :to_a - attr_reader :relation, :klass + delegate :length, :collect, :map, :each, :to => :to_a + attr_reader :relation, :klass, :associations_to_preload, :eager_load_associations def initialize(klass, relation, readonly = false, preload = [], eager_load = []) @klass, @relation = klass, relation @@ -12,6 +12,21 @@ module ActiveRecord @loaded = false end + def merge(r) + joins(r.relation.joins(r.relation)). + group(r.send(:group_clauses).join(', ')). + order(r.send(:order_clauses).join(', ')). + where(r.send(:where_clause)). + limit(r.taken). + offset(r.skipped). + select(r.send(:select_clauses).join(', ')). + eager_load(r.eager_load_associations). + preload(r.associations_to_preload). + from(r.send(:sources).any? ? r.send(:from_clauses) : nil) + end + + alias :& :merge + def preload(*associations) create_new_relation(@relation, @readonly, @associations_to_preload + Array.wrap(associations)) end @@ -25,23 +40,19 @@ module ActiveRecord end def select(selects) - create_new_relation(@relation.project(selects)) + selects.present? ? create_new_relation(@relation.project(selects)) : create_new_relation end - # TODO : This is temporary. We need .from in Arel. - attr_writer :from def from(from) - relation = create_new_relation - relation.from = from - relation + from.present? ? create_new_relation(@relation.from(from)) : create_new_relation end def group(groups) - create_new_relation(@relation.group(groups)) + groups.present? ? create_new_relation(@relation.group(groups)) : create_new_relation end def order(orders) - create_new_relation(@relation.order(orders)) + orders.present? ? create_new_relation(@relation.order(orders)) : create_new_relation end def reverse_order @@ -57,11 +68,11 @@ module ActiveRecord end def limit(limits) - create_new_relation(@relation.take(limits)) + limits.present? ? create_new_relation(@relation.take(limits)) : create_new_relation end def offset(offsets) - create_new_relation(@relation.skip(offsets)) + offsets.present? ? create_new_relation(@relation.skip(offsets)) : create_new_relation end def on(join) @@ -69,7 +80,7 @@ module ActiveRecord end def joins(join, join_type = nil) - return self if join.blank? + return create_new_relation if join.blank? join_relation = case join when String @@ -116,7 +127,7 @@ module ActiveRecord :conditions => where_clause, :limit => @relation.taken, :offset => @relation.skipped, - :from => @from + :from => (@relation.send(:from_clauses) if @relation.send(:sources).any?) }, ActiveRecord::Associations::ClassMethods::JoinDependency.new(@klass, @eager_load_associations, nil)) end @@ -289,9 +300,7 @@ module ActiveRecord end def create_new_relation(relation = @relation, readonly = @readonly, preload = @associations_to_preload, eager_load = @eager_load_associations) - r = self.class.new(@klass, relation, readonly, preload, eager_load) - r.from = @from - r + self.class.new(@klass, relation, readonly, preload, eager_load) end def where_clause(join_string = "\n\tAND ") |