鉴于数据库中存在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
之类的事情,但我想知道,如果有更好的方法。
答案 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