aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib/active_record/relation/spawn_methods.rb
diff options
context:
space:
mode:
authorPratik Naik <pratiknaik@gmail.com>2010-01-14 13:36:33 +0530
committerPratik Naik <pratiknaik@gmail.com>2010-01-16 00:02:46 +0530
commitbed9179aa1496f6d28891cf515af0d7e515ebbab (patch)
treeb0c551489b45f93f66c0d726c55fe000b59803ea /activerecord/lib/active_record/relation/spawn_methods.rb
parent1c30ec23fef2479cd037945e57a74e5c89c9ece1 (diff)
downloadrails-bed9179aa1496f6d28891cf515af0d7e515ebbab.tar.gz
rails-bed9179aa1496f6d28891cf515af0d7e515ebbab.tar.bz2
rails-bed9179aa1496f6d28891cf515af0d7e515ebbab.zip
Make scopes use relations under the hood
Diffstat (limited to 'activerecord/lib/active_record/relation/spawn_methods.rb')
-rw-r--r--activerecord/lib/active_record/relation/spawn_methods.rb28
1 files changed, 21 insertions, 7 deletions
diff --git a/activerecord/lib/active_record/relation/spawn_methods.rb b/activerecord/lib/active_record/relation/spawn_methods.rb
index 66eae69d92..a248c72715 100644
--- a/activerecord/lib/active_record/relation/spawn_methods.rb
+++ b/activerecord/lib/active_record/relation/spawn_methods.rb
@@ -19,21 +19,19 @@ module ActiveRecord
merged_relation = spawn.eager_load(r.eager_load_values).preload(r.preload_values).includes(r.includes_values)
- merged_relation.readonly_value = r.readonly_value unless merged_relation.readonly_value
- merged_relation.limit_value = r.limit_value unless merged_relation.limit_value
+ 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).
- offset(r.offset_value).
select(r.select_values).
from(r.from_value).
having(r.having_values)
- relation_order = r.order_values
- merged_order = relation_order.present? ? relation_order : order_values
- merged_relation.order_values = merged_order
+ merged_relation.order_values = Array.wrap(order_values) + Array.wrap(r.order_values)
merged_relation.create_with_value = @create_with_value
@@ -50,7 +48,7 @@ module ActiveRecord
merged_wheres = merged_wheres.reject {|p| p.is_a?(Arel::Predicates::Equality) && p.operand1.name == w.operand1.name }
end
- merged_wheres << w
+ merged_wheres += [w]
end
merged_relation.where_values = merged_wheres
@@ -74,5 +72,21 @@ module ActiveRecord
result
end
+ def only(*onlies)
+ result = Relation.new(@klass, table)
+
+ onlies.each do |only|
+ if (Relation::ASSOCIATION_METHODS + Relation::MULTI_VALUE_METHODS).include?(only)
+ result.send(:"#{only}_values=", send(:"#{only}_values"))
+ elsif Relation::SINGLE_VALUE_METHODS.include?(only)
+ result.send(:"#{only}_value=", send(:"#{only}_value"))
+ else
+ raise "Invalid argument : #{only}"
+ end
+ end
+
+ result
+ end
+
end
end