ruby-on-rails - ruby on Rails 中的 sum() 或 group() 虚拟属性

标签 ruby-on-rails ruby ruby-on-rails-3 rails-activerecord virtual-attribute

假设我有一个这样的模型:

class Surface < ActiveRecord::Base
  attr_accessible :width, :length

  def area
     self.width * self.length
  end
end

其中@surface.area返回表面的面积。现在,假设我有许多名为 @surfaces 的曲面,并且我想对所有面积求和。我该怎么做?

我最喜欢的解决方案如下所示:

@surfaces.sum(:area)

但是它不起作用。那么我如何在 Rails 中调用 .sum().group() 或任何类似的虚拟属性上的函数呢?我想避免 .each do |surface| 调用。

提前致谢。

最佳答案

sum 会很乐意接受 SQL 表达式,而不仅仅是列名,因此您需要做的就是将 sum 方法转换为 SQL:

@surfaces.sum('width * height')
@surfaces.sum('surface.width * surface.height') # If you think other tables might be involved.

此外,模型上的类方法会混合到关系中(因为作用域和类方法实际上是同一件事),因此您可以添加一个类方法来配合实例方法:

class Surface < ActiveRecord::Base
  def self.area
    sum('surface.width * surface.height')
  end
  def area
     self.width * self.length
  end
end

并说:

@surfaces.area

通常最好让数据库处理您的数据的繁重工作,这就是它们的用途和擅长的地方。

关于ruby-on-rails - ruby on Rails 中的 sum() 或 group() 虚拟属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40385536/

相关文章:

ruby-on-rails - RSpec 请求 - 如何为所有请求设置 http 授权 header

ruby-on-rails - 设计通过 reset_password_token 获取用户

ruby - LDAP(或 LDAP 的任何 Ruby 客户端库)是否支持批量调用?

ruby-on-rails - ruby rails 3 : help with sending emails

ruby-on-rails - 使用 PostgreSQL 在多列中进行全文搜索

ruby - 在特定匹配后将文本附加到文件

ruby - 如何在 Ruby 中表达无穷大?

ruby - 是否有使用 Google Images API 的 Ruby gem?

ruby - 类型不匹配 : String given - Trying to match strings in ruby

ruby-on-rails - Ruby 2.0 如何在包含模块后从模块中取消包含模块?