Ruby on rails 在rails中将多个查询链接在一起时,如何很好地处理异常?
在我的几个控制器中,我有如下代码:Ruby on rails 在rails中将多个查询链接在一起时,如何很好地处理异常?,ruby-on-rails,ruby,ruby-on-rails-4,exception-handling,rails-activerecord,Ruby On Rails,Ruby,Ruby On Rails 4,Exception Handling,Rails Activerecord,在我的几个控制器中,我有如下代码: @user .cars.find_by_id(params[:car_id]) .try(:wheels).find_by_id(params[:wheel_id]) .try(:screews).where(id: ids) 这当然会引发nil:NilClass的异常:nomethoderor:undefined方法'where'。我希望能够向我的用户提供更多关于出错原因的信息,在这种情况下,用户没有指定id的汽车 将find_by_id更改为
@user
.cars.find_by_id(params[:car_id])
.try(:wheels).find_by_id(params[:wheel_id])
.try(:screews).where(id: ids)
这当然会引发nil:NilClass的异常:nomethoderor:undefined方法'where'。我希望能够向我的用户提供更多关于出错原因的信息,在这种情况下,用户没有指定id的汽车
将find_by_id更改为find将导致上面的代码引发ActiveRecord::RecordNotFound异常,我可以处理该异常,但在这种情况下,我如何确定汽车或车轮是否丢失?RecordNotFound异常实际上并不包含那么多信息。有什么好办法处理好这类事情吗?最好是一些足够通用的东西,以便我可以轻松地在其他控制器中重用代码。ActiveRecord::RecordNotFound异常有一条消息,即找不到id=200的用户,因此您可以使用它来告诉您找不到哪个模型
只需拯救该异常,并使用该消息向用户显示信息。您可以在消息中搜索模型名称,如果愿意,可以显示自定义提示。ActiveRecord::RecordNotFound异常有一条消息,即找不到id=200的用户,因此您可以使用它告诉您找不到哪个模型
只需拯救该异常,并使用该消息向用户显示信息。您可以在消息中搜索模型名称,如果愿意,可以显示自定义提示。我认为您的代码有味道,您应该重构它
- 每个单元对其他单元的了解应有限:仅与当前单元“密切”相关的单元
- 每个单位只能和朋友交谈;不要和陌生人说话
- 只和你的直系朋友交谈李>
@user
.cars.find_by_id(params[:car_id])
.try(:wheels).find_by_id(params[:wheel_id])
.try(:screews).where(id: ids)
.find_by_id
是一种所谓的动态查找方法,它依赖于从Rails 4的核心中提取的方法缺失。改用.find
,它是向前兼容的,并且没有缺少metamagic的方法的开销
我们不需要从@user
确定查询范围,因为我们已经有了一个唯一的汽车id
Car.find(params[:car_id])
.try(:wheels).find_by_id(params[:wheel_id])
.try(:screews).where(id: ids)
如果我们想同时获取汽车
和车轮
,我们应该使用连接查询来进行有效的SQL查询
Car.joins(:wheels)
.where(id: params[:wheel_id])
.find(params[:car_id])
但如果我们真正需要的是螺丝,我们可以这样做:
# Doing a JOIN to cars requires a
# has_many :cars, through: :wheels relationsship
@screws = Screw.where(id: ids).joins(:cars, :wheels)
因此,我重申:
- 当您有唯一的ID时,不要通过父级定义查询的范围-您只是
- 用于创建更高效的查询
- 使用异常来处理异常情况,而不是正常的程序流
- 每个单元对其他单元的了解应有限:仅与当前单元“密切”相关的单元
- 每个单位只能和朋友交谈;不要和陌生人说话
- 只和你的直系朋友交谈李>
@user
.cars.find_by_id(params[:car_id])
.try(:wheels).find_by_id(params[:wheel_id])
.try(:screews).where(id: ids)
.find_by_id
是一种所谓的动态查找方法,它依赖于从Rails 4的核心中提取的方法缺失。改用.find
,它是向前兼容的,并且没有缺少metamagic的方法的开销
我们不需要从@user
确定查询范围,因为我们已经有了一个唯一的汽车id
Car.find(params[:car_id])
.try(:wheels).find_by_id(params[:wheel_id])
.try(:screews).where(id: ids)
如果我们想同时获取汽车
和车轮
,我们应该使用连接查询来进行有效的SQL查询
Car.joins(:wheels)
.where(id: params[:wheel_id])
.find(params[:car_id])
但如果我们真正需要的是螺丝,我们可以这样做:
# Doing a JOIN to cars requires a
# has_many :cars, through: :wheels relationsship
@screws = Screw.where(id: ids).joins(:cars, :wheels)
因此,我重申:
- 当您有唯一的ID时,不要通过父级定义查询的范围-您只是
- 用于创建更高效的查询
- 使用异常来处理异常情况,而不是正常的程序流
find\u by\u…
(在这种情况下,find\u by\u id
)并没有贬值<代码>按查找…和按查找代码>实际上是唯一没有折旧的动态查找程序。另外,如果他要重构这个find_by(id:params[:id]),
作为重构比find
更一致,因为find
将在哪里引发asfind_by
将返回第一个匹配记录或nil
就像find_by
一样。@engineersmnky感谢您的澄清,我在API文档(我相信是4.2)中查找find_by_id
,但找不到它,因此我假设它是一个动态查找器。尽管我有唯一的id,但我仍然希望确保该车属于当前用户。然后从用户处确定查询范围。但是你不应该使用这个链式怪物。作为一个注释,因为这似乎是一个巨大的误解