如果找不到所有记录,如何引发ActiveRecord :: RecordNotFound?

时间:2017-08-18 10:19:26

标签: ruby-on-rails activerecord

鉴于数据库中存在id为1的项目,但id为2的项目不存在,则以下行:

Item.find([1, 2])

会引发ActiveRecord::RecordNotFound错误。但是,以下行不会:

Item.where(id: [1, 2])

相反,它只会返回ID为1的项目。如果我查询唯一值,是否可以在find上强制执行where的行为。

我有一个模型Foo,除了id之外,还有一个uid字符串属性。每个foo都有一个唯一的uid值。所以给定一个uids数组,我希望能够获取所有foos或引发错误,如果其中一个uid值为foo不存在。

P.S。我可以做raise ActiveRecord::RecordNotFound unless query_result.count == uids.count之类的事情,但我想知道,如果有更好的方法。

2 个答案:

答案 0 :(得分:2)

我认为where没有任何此类规定(只返回关系而不是实际的AR对象)。

我检查了源代码,看起来ActiveRecord使用相同的技巧来引发RecordNotFound异常,因为它无法从传递的数组中找到某个id。 (匹配结果的大小与传递的ids数组的大小) 推荐方法find调用here以及他们引发异常的地方here

答案 1 :(得分:0)

此处如果您想引发ActiveRecord::RecordNotFound错误。 您必须使用ActiveRecord#find方法,因为ActiveRecord#where不会引发此错误。

我认为你应该使用ActiveRecord#find,但你可以尝试

ids = [1,2,3,4,5]
foo = Foo.where(id: ids)
a = foo.pluck(:id)
raise ActiveRecord::RecordNotFound if ids!=a