我有几个计算值作为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
然而,这显然是低效和重复的。我也考虑过初始化所有这些值,尽管我不知道这样做的最有效方法。
答案 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
方法或其他冷却工具感兴趣。
我希望有所帮助。