Activerecord救援

时间:2014-05-09 07:15:50

标签: ruby activerecord

我有一个使用ActiveRecord但不使用Rails的红宝石应用。

我想解决所有数据库错误,在我的情况下可能包含SQLite3::BusyException

是否有更好的方法来包装每个Model.findModel.whereobj.save等?

我想为每个修补/劫持数据库操作的模型添加一个模块,但是where似乎很复杂,而且不容小觑:

def where
  super
rescue ActiveRecord::RecordNotFound
rescue SQLite3::BusyException => e
  p [:warning, e.message]
end

1 个答案:

答案 0 :(得分:0)

当使用赛璐珞时,我遇到了类似的问题,我需要捕获错误,因为连接池无法正常使用赛璐珞使用纤维。我使用类似下面的包装器方法来帮助确保错误被​​捕获并解决了我的代码中的连接收获。对于您的方案,它可能如下所示:

module TrackActiveRecordErrors
  def db(&block)
    begin
      yield block
    rescue StandardError => e
      p [:warning, e.message]
      # ... and other sort of logging, alerting you'd like
      raise e
    ensure
      # Put your clean-up code here
    end
  end
end

在类中你想使用这个包装器:

class DoSomething
  include TrackActiveRecordErrors

  def find_something(id)
    db do
      a_something = Model.find(id)
    end
    a_something
  end
end

它并不漂亮,但它比在模型类中调整AR的魔力要容易得多。