aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib/active_record/relation.rb
diff options
context:
space:
mode:
authorEmilio Tagua <miloops@gmail.com>2009-07-21 20:21:03 -0300
committerEmilio Tagua <miloops@gmail.com>2009-07-21 20:21:03 -0300
commit0e0866e0565bd530ee265b9298accff4185f7022 (patch)
tree80bb65ebb7567999ca3de72cec47fc31fd2e3969 /activerecord/lib/active_record/relation.rb
parentf32c3709830eb8d9f68a59c94f6791621c2b52ac (diff)
downloadrails-0e0866e0565bd530ee265b9298accff4185f7022.tar.gz
rails-0e0866e0565bd530ee265b9298accff4185f7022.tar.bz2
rails-0e0866e0565bd530ee265b9298accff4185f7022.zip
Introduced ActiveRecord::Relation, a layer between an ARel relation and an AR relation
Diffstat (limited to 'activerecord/lib/active_record/relation.rb')
-rw-r--r--activerecord/lib/active_record/relation.rb39
1 files changed, 39 insertions, 0 deletions
diff --git a/activerecord/lib/active_record/relation.rb b/activerecord/lib/active_record/relation.rb
new file mode 100644
index 0000000000..36e8d98298
--- /dev/null
+++ b/activerecord/lib/active_record/relation.rb
@@ -0,0 +1,39 @@
+module ActiveRecord
+ class Relation
+ delegate :delete, :to_sql, :to => :relation
+ CLAUSES_METHODS = ["where", "join", "project", "group", "order", "take", "skip"].freeze
+ attr_reader :relation, :klass
+
+ def initialize(klass, table = nil)
+ @klass = klass
+ @relation = Arel::Table.new(table || @klass.table_name)
+ end
+
+ def to_a
+ @klass.find_by_sql(@relation.to_sql)
+ end
+
+ def first
+ @relation = @relation.take(1)
+ to_a.first
+ end
+
+ for clause in CLAUSES_METHODS
+ class_eval %{
+ def #{clause}(_#{clause})
+ @relation = @relation.#{clause}(_#{clause}) if _#{clause}
+ self
+ end
+ }
+ end
+
+ private
+ def method_missing(method, *args, &block)
+ if @relation.respond_to?(method)
+ @relation.send(method, *args, &block)
+ elsif Array.instance_methods.include?(method.to_s)
+ to_a.send(method, *args, &block)
+ end
+ end
+ end
+end