繁体   English   中英

sum()或group()ruby on rails上的虚拟属性

[英]sum() or group() virtual attributes in ruby on rails

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

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

  def area
     self.width * self.length
  end
end

其中@surface.area返回曲面的面积。 现在,假设我有许多名为@surfaces表面,我想总结所有区域。 我该怎么做呢?

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

@surfaces.sum(:area)

但它不起作用。 所以,我怎么能叫.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

通常情况下,让数据库对您的数据进行繁重的处理会更好,这就是他们的目标以及他们擅长的目标。

这可以通过Enumerable#reduce方法实现:

@surfaces.reduce(0){ |sum, surface| sum + surface.area }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM