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、すべての値がである場合の結果が得られますnilnil必要に応じて、sをゼロに置き換えることができます。:rejectRubyArrayクラスとEnumerableクラスのメソッドやその他のcoolsツールにも興味があるかもしれません。

それがお役に立てば幸いです。

于 2013-01-22T15:30:07.633 に答える