使用ActiveRecord时是否应始终检查“保存”的返回值?

时间:2012-08-09 21:37:12

标签: ruby activerecord coding-style

一般情况下,使用ActiveRecord时是否应始终检查save的返回值?

例如,我遇到过这样的代码:

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的验证不断变化,并且在不久的将来(甚至从现在起一年内)可能发生变化,我的想法是应该检查active_record_instance.save的返回值。另一种选择是使用active_record_instance.save!

检查记录是否已保存是否合适?或者foo方法微观管理一些不应该关注的东西,因为当前的验证没有失败?

2 个答案:

答案 0 :(得分:2)

也许你可以使用保存!方法,捕获异常并将你的逻辑放在里面。

begin
  foo.save!
rescue ActiveRecord::RecordInvalid
  # handle logic here
end

答案 1 :(得分:1)

真正的答案是,“你关心有问题的数据吗?”

如果您关心数据,那么是的,您应该返回错误或抛出异常,并以某种方式告知验证失败的原因。

如果您真的不在乎它是否保存,并且会在10秒内尝试,此时您希望它能够正常工作,然后忽略该错误。

作为个人偏好和经验,我宁愿快速而且戏剧性地失败,也不愿花费数小时或数天来追捕错误,因为之前的50步并没有实际保存。