跳转到内容

Ruby on Rails/ActiveRecord/计算

来自维基教科书,开放世界中的开放书籍

计算提供用于计算 ActiveRecord 模型中列的聚合值的方法。

所有计算都通过 calculate 方法处理。calculate 方法接受操作名称、列名和任何选项。选项可用于使用 :conditions、:order、:group、:having 和 :joins 自定义查询。

支持的计算是

  • 平均值
  • 总和
  • 最小值
  • 最大值
  • 计数

calculate 方法有两种工作模式。如果 :group 选项设置,则结果将作为单个数值返回(计数为 fixnum,平均值为 float,其他所有值则为列类型)。如果设置了 :group 选项,则结果将作为值的有序 Hash 返回,并按 :group 列对它们进行分组。:group 选项接受列名或belongs_to关联。

注意,如果计算中指定的条件导致基础表中没有返回任何值,则 calculate 方法将返回nil.

例如

 values = Person.maximum(:age, :group => 'last_name')
 puts values["Drake"]
 => 43
 drake  = Family.find_by_last_name('Drake')
 values = Person.maximum(:age, :group => :family) # Person belongs_to :family
 puts values[drake]
 => 43
 values.each do |family, max_age|
    ...
 end

平均值

[编辑 | 编辑源代码]

您可以使用 average 方法计算特定列的平均值。例如

 Person.average(:age)

将返回 Person 模型中所有人的平均年龄。

自定义查询的示例

 Person.average(:age, :conditions => ['age >= ?', 55])

这将返回 55 岁或以上的人的平均年龄。

sum 方法将计算特定列的总和。例如

 Product.sum(:number_in_stock)

将返回库存中产品的总和。

自定义查询的示例

 Product.sum(:number_in_stock, :conditions => ['category_id = ?', 10])

将返回类别 10 且库存中的产品的数量之和。

最小值

[编辑 | 编辑源代码]

minimum 方法将计算特定列的最小值。例如

 Donation.minimum(:amount)

将返回捐赠的最低金额。

自定义查询的示例

 Donation.minimum(:amount, :conditions => ['created_at > ?', 1.year.ago])

这将返回过去一年中捐赠的最低金额。

最大值

[编辑 | 编辑源代码]

maximum 方法将计算特定列的最大值。例如

 Donation.maximum(:amount)

将返回捐赠的最高金额。

自定义查询的示例

 Donation.maximum(:amount, :conditions => ['created_at > ?', 1.year.ago])

这将返回过去一年中捐赠的最高金额。

计算满足条件的项目的数量。

 TestResult.count(:all)

将返回数据库中 TestResult 对象的数量。

自定义查询的示例

 TestResult.count(:all,:conditions=>['starttime>=?',Time.now-3600*24])

将返回其 starttime 字段在过去 24 小时内的 TestResult 对象的数量。

华夏公益教科书