0

一般来说,save使用ActiveRecord时是否应该检查always的返回值?

例如,我遇到了一些这样的代码:

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考虑到当前的验证没有失败,该方法是否对某些不应该关注的事情进行微观管理?

4

2 回答 2

2

也许你可以使用保存!方法,捕获异常并将您的逻辑放入 .

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

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

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

如果您真的不在乎它是否保存,并且它将在 10 秒内尝试,此时您希望它可以工作,则忽略该错误。

作为个人喜好和经验,我宁愿让某些东西快速而剧烈地失败,也不愿花费数小时或数天来寻找错误,因为 50 步之前的东西实际上并没有保存。

于 2012-08-10T00:49:16.413 回答