1

私はこのようなものを持っています:

    good_attrs = %w(firm_size priority_level)       

    good_attrs.each do |attr|
      if (score.send(attr) > max.send(attr))
        max.send("#{attr}=", score.send(attr))
      end
    end

Maxただし、時折、次のようなレコードに遭遇することがあります。

#<Max:0x007fe01024b240> {
                           :id => 2,
                      :user_id => 1,
                    :firm_size => 101.0,
               :priority_level => nil,
                   :created_at => Fri, 23 Nov 2012 01:55:53 UTC +00:00,
                   :updated_at => Fri, 23 Nov 2012 01:58:16 UTC +00:00
}

すなわちmax.priority_level= nil

では、イニシャルを変更して評価の両側のケースif statementを処理するにはどうすればよいでしょうか? nilつまり、scoreまたはmax属性が nil の場合。理想的には、それを扱い、それに応じて進めたいと思い0ます。

4

2 に答える 2

3

nilと比較することはできませんFloat

あなたの場合、次の事実を利用できますnil.to_f == 0.0

good_attrs = %w(firm_size priority_level)       

good_attrs.each do |attr|
  if score.send(attr).to_f > max.send(attr).to_f
    max.send("#{attr}=", score.send(attr))
  end
end
于 2012-11-26T22:18:10.943 に答える
0

attr_reader forpriority_levelおよびfirm_sizeinをオーバーロードできますMax

def priority_level
  read_attribute(:priority_level).nil? ? 0 : super
end

after_initializeまたは、ブロックにデフォルト値を設定することもできます

after_initialize do
  self.priority_level = 0 if self.priority_level.nil?
end
于 2012-11-26T22:10:50.843 に答える