[英]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.