2

Rails を使い始めたのですが、ブロック操作で行き詰まっています。モデルをループし、2 つの日時フィールドの差を計算して新しいフィールドの整数値を更新したいと考えています。コンソールでこれを行う:

MyModel.all.each do |m|
  m.new_integer_field = m.existing_datetime_field - m.parent_object.existing_datetime_field
  m.save!
end

結果は

 NoMethodError: undefined method `-' for nil:NilClass

次のようにすると、1 つのレコードで機能します。

m = MyModel.find(1)
m.new_integer_field = m.existing_datetime_field - m.parent_object.existing_datetime_field
m.save

基本的な構文だと思いますが、明確な説明が見つかりませんでした。いくつかの指針を前進させてくれてありがとう。

4

2 に答える 2

1

いずれかのインスタンスのm.existing_datetime_fieldがnilであったため、操作が機能しませんでした。よくわからない場合は、nil値を確認する必要があります。

MyModel.all.each do |m|
  unless m.existing_datetime_field == nil
    m.new_integer_field = m.existing_datetime_field - m.parent_object.existing_datetime_field
  m.save!
end
于 2013-01-13T12:27:11.807 に答える
0

すでに述べたように、おそらくインスタンスの属性の 1 つはnil.

#inspectインスタンスでこの使用を確認するには:

MyModel.all.each {|i| puts i.existing_datetime_field.inspect }

これらのオブジェクトの 1 つが存在nilし、-メソッドが定義されていないようです。

あなたが提案したように、差を計算する前にオペランドをチェックすることができます。

于 2013-01-19T19:13:26.750 に答える