0

save一般に、 ActiveRecord を使用する場合は常に の戻り値をチェックする必要がありますか?

たとえば、次のようなコードに出くわしました。

def foo(active_record_instance)
  active_record_instance.field_1 = 'a'
  active_record_instance.field_2 = 'b'
  # ...15 more lines...
  active_record_instance.save # <==
  baz = bar(active_record_instance.id)
  # ...15 more lines that use baz...
  baz
end

def bar(id)
  instance = ActiveRecordSubclass.find(id)
  instance.field_3 = instance.field_1 + instance.field_2
  instance
end

これは少し不自然ですが、私が取り組んでいるコードベースのかなり現実的な例です。(これは、このパターンの孤立したケースではありません。)

の検証ActiveRecordSubclassは流動的であり、近い将来 (または今から 1 年後) に変更される可能性があることを考えると、 の戻り値をactive_record_instance.saveチェックする必要があると思います。別の方法として、 を使用することもできますactive_record_instance.save!

レコードが保存されているかどうかを確認するのは適切ですか? それともfoo、現在の検証が失敗しないことを考えると、メソッドは問題にすべきではない何かを細かく管理していますか?

4

2 に答える 2

2

多分あなたは保存を使うことができます!メソッド、例外をキャッチし、ロジックを内部に配置します。

begin
  foo.save!
rescue ActiveRecord::RecordInvalid
  # handle logic here
end
于 2012-08-09T21:53:44.743 に答える
1

本当の答えは、「問題のデータを気にしますか?」です。

データが気になる場合は、そうです、何か false を返すか、例外をスローし、検証に失敗した理由を何らかの形で伝える必要があります。

保存するかどうかを本当に気にせず、10 秒後に試行され、その時点で動作することが期待される場合は、エラーを無視してください。

個人的な好みと経験として、50 ステップ前の何かが実際に保存されなかったためにバグを探し出すのに何時間も何日も費やすよりも、何かが速く劇的に失敗することを望んでいます。

于 2012-08-10T00:49:16.413 に答える