【问题标题】:Should the return value of "save" always be checked when using ActiveRecord?使用 ActiveRecord 时是否应始终检查“保存”的返回值?
【发布时间】:2012-08-09 21:37:12
【问题描述】:

一般情况下,使用 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 方法是否微管理了一些不应该成为其关注点的事情?

【问题讨论】:

    标签: ruby activerecord coding-style


    【解决方案1】:

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

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

    【讨论】:

    • 澄清一下:我的问题更多是关于是否应该进行异常或返回值检查应该。我的一位同事说要忽略记录是否保存。
    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-21
      • 1970-01-01
      • 1970-01-01
      • 2012-08-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多