我有一个使用ActiveRecord
但不使用Rails
的红宝石应用。
我想解决所有数据库错误,在我的情况下可能包含SQLite3::BusyException
。
是否有更好的方法来包装每个Model.find
,Model.where
,obj.save
等?
我想为每个修补/劫持数据库操作的模型添加一个模块,但是where
似乎很复杂,而且不容小觑:
def where
super
rescue ActiveRecord::RecordNotFound
rescue SQLite3::BusyException => e
p [:warning, e.message]
end
答案 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的魔力要容易得多。