Ruby on Rails中的乘法nil值的模型

时间:2013-01-22 14:37:42

标签: ruby-on-rails ruby-on-rails-3 model

我有几个计算值作为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

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

1 个答案:

答案 0 :(得分: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。如果您愿意,可以用零替换nil s。您可能还对Ruby Array和Enumerable类中的:reject方法或其他冷却工具感兴趣。

我希望有所帮助。