首页 > 解决方案 > 使用 ActiveRecord 在哪里找不到记录时如何失败?

问题描述

#find找不到记录时引发异常时,如何使用 获得相同的效果#where

我想按key属性获取一些记录,如果有任何丢失则失败。关键属性是唯一的。

keys = %w(apple pear grape)
fruits = Fruit.where(key: keys)

这可能会返回 0 到 3 条记录。

我希望这失败,除非返回 3 条记录。

是否可以在 ActiveRecord 中执行此操作,或者我是否需要检查size返回的集合:

fruits = Fruit.where(key: keys).tap { |fruits| raise(...) unless fruits.size == keys.size }

标签: ruby-on-railsruby-on-rails-5

解决方案


where 方法旨在镜像 SQL 的 where 子句,因此如果没有找到匹配的记录,它不会失败。它只会返回一个空关系。

过滤记录后,如果返回的关系的大小不等于您要查找的大小,则引发错误。您需要在遍历任何返回的记录之前执行此操作

keys = %w(apple pear grape)
fruits = Fruit.where(key: keys)
raise 'my special error' unless fruits.size == keys.length
# loop here  

推荐阅读