一般情况下,使用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
方法微观管理一些不应该关注的东西,因为当前的验证没有失败?
答案 0 :(得分:2)
也许你可以使用保存!方法,捕获异常并将你的逻辑放在里面。
begin
foo.save!
rescue ActiveRecord::RecordInvalid
# handle logic here
end
答案 1 :(得分:1)
真正的答案是,“你关心有问题的数据吗?”
如果您关心数据,那么是的,您应该返回错误或抛出异常,并以某种方式告知验证失败的原因。
如果您真的不在乎它是否保存,并且会在10秒内尝试,此时您希望它能够正常工作,然后忽略该错误。
作为个人偏好和经验,我宁愿快速而且戏剧性地失败,也不愿花费数小时或数天来追捕错误,因为之前的50步并没有实际保存。