Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
张重言
rails
提交
5aea01a6
R
rails
项目概览
张重言
/
rails
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
rails
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
5aea01a6
编写于
4月 13, 2012
作者:
J
Jon Leighton
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
extract deprecated #calculate code
上级
d961f490
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
25 addition
and
83 deletion
+25
-83
activerecord/lib/active_record/relation/calculations.rb
activerecord/lib/active_record/relation/calculations.rb
+25
-83
未找到文件。
activerecord/lib/active_record/relation/calculations.rb
浏览文件 @
5aea01a6
...
...
@@ -3,56 +3,19 @@
module
ActiveRecord
module
Calculations
# Count
operates using three different approache
s.
# Count
the record
s.
#
# * Count all: By not passing any parameters to count, it will return a count of all the rows for the model.
# * Count using column: By passing a column name to count, it will return a count of all the
# rows for the model with supplied column present.
# * Count using options will find the row count matched by the options used.
# Person.count
# # => the total count of all people
#
# The third approach, count using options, accepts an option hash as the only parameter. The options are:
# Person.count(:age)
# # => returns the total count of all people whose age is present in database
#
# * <tt>:conditions</tt>: An SQL fragment like "administrator = 1" or [ "user_name = ?", username ].
# See conditions in the intro to ActiveRecord::Base.
# * <tt>:joins</tt>: Either an SQL fragment for additional joins like "LEFT JOIN comments ON comments.post_id = id"
# (rarely needed) or named associations in the same form used for the <tt>:include</tt> option, which will
# perform an INNER JOIN on the associated table(s). If the value is a string, then the records
# will be returned read-only since they will have attributes that do not correspond to the table's columns.
# Pass <tt>:readonly => false</tt> to override.
# * <tt>:include</tt>: Named associations that should be loaded alongside using LEFT OUTER JOINs.
# The symbols named refer to already defined associations. When using named associations, count
# returns the number of DISTINCT items for the model you're counting.
# See eager loading under Associations.
# * <tt>:order</tt>: An SQL fragment like "created_at DESC, name" (really only used with GROUP BY calculations).
# * <tt>:group</tt>: An attribute name by which the result should be grouped. Uses the GROUP BY SQL-clause.
# * <tt>:select</tt>: By default, this is * as in SELECT * FROM, but can be changed if you, for example,
# want to do a join but not include the joined columns.
# * <tt>:distinct</tt>: Set this to true to make this a distinct calculation, such as
# SELECT COUNT(DISTINCT posts.id) ...
# * <tt>:from</tt> - By default, this is the table name of the class, but can be changed to an
# alternate table name (or even the name of a database view).
# Person.count(:all)
# # => performs a COUNT(*) (:all is an alias for '*')
#
# Examples for counting all:
# Person.count # returns the total count of all people
#
# Examples for counting by column:
# Person.count(:age) # returns the total count of all people whose age is present in database
#
# Examples for count with options:
# Person.count(:conditions => "age > 26")
#
# # because of the named association, it finds the DISTINCT count using LEFT OUTER JOIN.
# Person.count(:conditions => "age > 26 AND job.salary > 60000", :include => :job)
#
# # finds the number of rows matching the conditions and joins.
# Person.count(:conditions => "age > 26 AND job.salary > 60000",
# :joins => "LEFT JOIN jobs on jobs.person_id = person.id")
#
# Person.count('id', :conditions => "age > 26") # Performs a COUNT(id)
# Person.count(:all, :conditions => "age > 26") # Performs a COUNT(*) (:all is an alias for '*')
#
# Note: <tt>Person.count(:all)</tt> will not work because it will use <tt>:all</tt> as the condition.
# Use Person.count instead.
# Person.count(:age, distinct: true)
# # => counts the number of different age values
def
count
(
column_name
=
nil
,
options
=
{})
column_name
,
options
=
nil
,
column_name
if
column_name
.
is_a?
(
Hash
)
calculate
(
:count
,
column_name
,
options
)
...
...
@@ -98,21 +61,22 @@ def sum(*args)
end
# This calculates aggregate values in the given column. Methods for count, sum, average,
# minimum, and maximum have been added as shortcuts. Options such as <tt>:conditions</tt>,
# <tt>:order</tt>, <tt>:group</tt>, <tt>:having</tt>, and <tt>:joins</tt> can be passed to customize the query.
# minimum, and maximum have been added as shortcuts.
#
# There are two basic forms of output:
#
# * Single aggregate value: The single value is type cast to Fixnum for COUNT, Float
# for AVG, and the given column's type for everything else.
# * Grouped values: This returns an ordered hash of the values and groups them by the
# <tt>:group</tt> option. It takes either a column name, or the name of a belongs_to association.
#
# values = Person.maximum(:age, :group => 'last_name')
# * Grouped values: This returns an ordered hash of the values and groups them. It
# takes either a column name, or the name of a belongs_to association.
#
# values = Person.group('last_name').maximum(:age)
# puts values["Drake"]
# => 43
#
# drake = Family.find_by_last_name('Drake')
# values = Person.
maximum(:age, :group => :family
) # Person belongs_to :family
# values = Person.
group(:family).maximum(:age
) # Person belongs_to :family
# puts values[drake]
# => 43
#
...
...
@@ -120,47 +84,25 @@ def sum(*args)
# ...
# end
#
# Options:
# * <tt>:conditions</tt> - An SQL fragment like "administrator = 1" or [ "user_name = ?", username ].
# See conditions in the intro to ActiveRecord::Base.
# * <tt>:include</tt>: Eager loading, see Associations for details. Since calculations don't load anything,
# the purpose of this is to access fields on joined tables in your conditions, order, or group clauses.
# * <tt>:joins</tt> - An SQL fragment for additional joins like "LEFT JOIN comments ON comments.post_id = id".
# (Rarely needed).
# The records will be returned read-only since they will have attributes that do not correspond to the
# table's columns.
# * <tt>:order</tt> - An SQL fragment like "created_at DESC, name" (really only used with GROUP BY calculations).
# * <tt>:group</tt> - An attribute name by which the result should be grouped. Uses the GROUP BY SQL-clause.
# * <tt>:select</tt> - By default, this is * as in SELECT * FROM, but can be changed if you for example
# want to do a join, but not include the joined columns.
# * <tt>:distinct</tt> - Set this to true to make this a distinct calculation, such as
# SELECT COUNT(DISTINCT posts.id) ...
#
# Examples:
# Person.calculate(:count, :all) # The same as Person.count
# Person.average(:age) # SELECT AVG(age) FROM people...
# Person.minimum(:age, :conditions => ['last_name != ?', 'Drake']) # Selects the minimum age for
# # everyone with a last name other than 'Drake'
#
# # Selects the minimum age for any family without any minors
# Person.
minimum(:age, :having => 'min(age) > 17', :group => :last_nam
e)
# Person.
group(:last_name).having("min(age) > 17").minimum(:ag
e)
#
# Person.sum("2 * age")
def
calculate
(
operation
,
column_name
,
options
=
{})
if
options
.
except
(
:distinct
).
present?
apply_finder_options
(
options
.
except
(
:distinct
)).
calculate
(
operation
,
column_name
,
:distinct
=>
options
[
:distinct
])
else
relation
=
with_default_scope
if
relation
.
equal?
(
self
)
if
eager_loading?
||
(
includes_values
.
present?
&&
references_eager_loaded_tables?
)
construct_relation_for_association_calculations
.
calculate
(
operation
,
column_name
,
options
)
else
perform_calculation
(
operation
,
column_name
,
options
)
end
relation
=
with_default_scope
if
relation
.
equal?
(
self
)
if
eager_loading?
||
(
includes_values
.
present?
&&
references_eager_loaded_tables?
)
construct_relation_for_association_calculations
.
calculate
(
operation
,
column_name
,
options
)
else
relation
.
calculate
(
operation
,
column_name
,
options
)
perform_calculation
(
operation
,
column_name
,
options
)
end
else
relation
.
calculate
(
operation
,
column_name
,
options
)
end
rescue
ThrowResult
0
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录