这就是我在我的rails应用程序及其工作中正在做的事情,但我正在寻找一个更清洁的解决方案:
class Workorder < ActiveRecord::Base
has_many :events, :through => :tasks
def total_hours
events.map{|e| e.hours}.reduce(:+)
end
它给出了所有任务事件的总小时数:
workorder.total_hours
但是,我也有有孩子的工作人员:
has_many :children, :class_name => "Workorder", :foreign_key => "parent_id"
我想知道所有孩子及其任务的总小时数。
这些不起作用:
def total_children_hours
self.children.events.map{|e| e.hours}.reduce(:+)
end
I get - undefined method `events'
def total_children_hours
self.children.map{|e| e.total_hours}.reduce(:+)
end
I get - nil can't be coerced into BigDecimal
感谢您的帮助!
答案 0 :(得分:1)
我不知道你是否看过ActiveRecord Calculations.html但是你可以做到
def total_hours
events.sum(:hours)
end
def total_children_hours
events.children.sum(:hours)
end
我认为这是制作列总和的最简单方法
答案 1 :(得分:0)
那是因为你有很多孩子。每个人都有很多活动。
def total_children_hours
hours = 0
self.children(s).each do |children|
hours += children.events.map{|e| e.hours}.to_i.reduce(:+)
end
hours
end
检查这个类似的主题:
Ruby on Rails nil can't be coerced into BigDecimal
的ActiveRecord ::计算
http://api.rubyonrails.org/classes/ActiveRecord/Calculations.html
答案 2 :(得分:0)
尝试解决方案:
class Workorder < ActiveRecord::Base
has_many :events, :through => :tasks
def total_hours
events.map {|e| e.hours }.reduce(:+) || 0
end
end
def total_children_hours
children.map {|e| e.total_hours }.reduce(:+)
end