0

作为 risk.rb 模型的一部分,我有几个计算值

before_save :calculate_risk
def calculate_risk
  self.risk1_total = self.component1 * self.component2 * self.component3
  self.risk2_total = self.component4 * self.component5 * self.component6
  ...
end

我希望能够在不完全填写表格的情况下产生风险,因此这些组件中的每一个都将为零。所以这个方法会产生错误,因为 * 不是 nil 的有效方法。处理这个问题的最佳方法是什么?我考虑过

def calculate_risk
  if self.component1.nil? || self.component2.nil? || self.component3.nil?
    self.risk1_total = self.component1 * self.component 2 * self.component3
  elsif ...
end

然而,这显然是低效且重复的。我还考虑过初始化所有这些值,尽管我不知道最有效的方法。

4

1 回答 1

2

您可以执行以下操作:

before_save :calculate_risk
def calculate_risk
  self.risk1_total = [self.component1,self.component2,self.component3].compact.inject(:*)
  self.risk2_total = [self.component4,self.component5,self.component6].compact.inject(:*)
  ...
end

这是假设您希望从计算中删除 nil 值。这将给出一个结果,nil如果所有值都是nil。如果您愿意,可以将nils 替换为零。您可能还对:rejectRuby Array 和 Enumerable 类中的方法或其他冷却工具感兴趣。

我希望这会有所帮助。

于 2013-01-22T15:30:07.633 回答