aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib/active_record/relation.rb
diff options
context:
space:
mode:
authorPratik Naik <pratiknaik@gmail.com>2009-12-28 18:38:28 +0530
committerPratik Naik <pratiknaik@gmail.com>2009-12-28 18:38:28 +0530
commit8f5d9eb0e2d05c5ca10c313bb47dbcab335c6fa7 (patch)
treeeb15bd788eed4ae3a6be65044f131b9ae6ec0852 /activerecord/lib/active_record/relation.rb
parentaefa975fdde01b1beaacbe065fe4b2bad69295d3 (diff)
downloadrails-8f5d9eb0e2d05c5ca10c313bb47dbcab335c6fa7.tar.gz
rails-8f5d9eb0e2d05c5ca10c313bb47dbcab335c6fa7.tar.bz2
rails-8f5d9eb0e2d05c5ca10c313bb47dbcab335c6fa7.zip
Add Relation#count
Diffstat (limited to 'activerecord/lib/active_record/relation.rb')
-rw-r--r--activerecord/lib/active_record/relation.rb45
1 files changed, 45 insertions, 0 deletions
diff --git a/activerecord/lib/active_record/relation.rb b/activerecord/lib/active_record/relation.rb
index 93f7b74c68..cb252eea70 100644
--- a/activerecord/lib/active_record/relation.rb
+++ b/activerecord/lib/active_record/relation.rb
@@ -204,6 +204,20 @@ module ActiveRecord
end
end
+ def count(*args)
+ column_name, options = construct_count_options_from_args(*args)
+ distinct = options[:distinct] ? true : false
+
+ column = if @klass.column_names.include?(column_name.to_s)
+ Arel::Attribute.new(@relation.table, column_name)
+ else
+ Arel::SqlLiteral.new(column_name == :all ? "*" : column_name.to_s)
+ end
+
+ relation = select(column.count(distinct))
+ @klass.connection.select_value(relation.to_sql).to_i
+ end
+
def destroy_all
to_a.each {|object| object.destroy}
reset
@@ -337,5 +351,36 @@ module ActiveRecord
}.join(',')
end
+ def construct_count_options_from_args(*args)
+ options = {}
+ column_name = :all
+
+ # We need to handle
+ # count()
+ # count(:column_name=:all)
+ # count(options={})
+ # count(column_name=:all, options={})
+ # selects specified by scopes
+
+ # TODO : relation.projections only works when .select() was last in the chain. Fix it!
+ case args.size
+ when 0
+ column_name = @relation.send(:select_clauses).join(', ') if @relation.respond_to?(:projections) && @relation.projections.present?
+ when 1
+ if args[0].is_a?(Hash)
+ column_name = @relation.send(:select_clauses).join(', ') if @relation.respond_to?(:projections) && @relation.projections.present?
+ options = args[0]
+ else
+ column_name = args[0]
+ end
+ when 2
+ column_name, options = args
+ else
+ raise ArgumentError, "Unexpected parameters passed to count(): #{args.inspect}"
+ end
+
+ [column_name || :all, options]
+ end
+
end
end