异常不属于模型

时间:2019-02-19 23:08:11

标签: ruby-on-rails ruby activerecord

我在如下所示的Rails模型上用ruby编写了一个函数

def sorted_exp
  begin
    exp.order("currently_active = true DESC, TO_DATE(to_date, 'MM-DD-YYYY') DESC")
  rescue 
    exp.order("currently_active = true DESC")
  end
end

,但to_date列中的条目很少,由于该异常属于“ 2018年9月”。当我尝试处理model中的异常时,它失败了,并且没有出现在rescue部分中。我不知道为什么它不能在这里捕获模型中的错误,为什么它不能在救援部分中返回查询。

引发的异常如下:

  

PG :: InvalidDatetimeFormat:错误:“ MM”的值“ se”无效

1 个答案:

答案 0 :(得分:0)

sorted_exp方法中,未使用查询的输出。当使用调用的值时,Rails实际上执行对数据库的调用。在这种情况下,this的值可能已在其他函数中使用,并且错误从此处引发,指向此行:exp.order("currently_active = true DESC, TO_DATE(to_date, 'MM-DD-YYYY') DESC")
我不确定您的确切用例,但是在此块中捕获异常的唯一方法是使用查询应该返回的值,例如计算返回的对象数(同样,这取决于您的使用情况)。
例如,尽管位于begin..rescue块中,但以下查询会引发错误:

begin
  User.order("TO_DATE(users.created_at, 'MONTH-YYYY') DESC")
rescue
  puts "In rescue block"
end

这会引发以下错误:

  

ActiveRecord :: StatementInvalid:PG :: UndefinedFunction:错误:函数to_date(没有时区的时间戳,未知)

但是,当在begin块本身中使用此查询的输出时,将捕获异常。例如:

begin
  sorted_users = User.order("TO_DATE(users.created_at, 'MONTH-YYYY') DESC")
  count = sorted_users.count
rescue
  puts "In rescue block"
end

此输出为:

  

在救援区

这是因为查询实际上是在begin块本身中执行的,因此被我们的rescue块捕获了。