我试图通过limit
了解Rails ActiveRecord的行为。
假设我的模型Car
只有一个属性name
。
现在在控制台(rails console
)中,如果我输入:
Car.limit(0).where(name: 'foo')
我得到了
SELECT "cars".* FROM "cars" WHERE "cars"."name" = 'foo' LIMIT 0
这是正确的,但是:
Car.limit(0).find_by_id(1)
给出
SELECT "cars".* FROM "cars" WHERE "cars"."id" = 1 LIMIT 1
为什么忽略limit
选项?
请注意
Car.where(name:'foo').find_by_id(1)
给出
SELECT "cars".* FROM "cars" WHERE "cars"."name" = 'foo' AND "cars"."id" = 1 LIMIT 1
所以find_by_id
(或find
)忽略limit
但接受where
?你怎么解释这个?
旁注
我知道这些查询没有意义。我在一个执行Car.limit(0).find_by_id(1)
的项目中有一个边缘情况,预期的结果是得到一个nil对象。我想了解为什么find_by_id
或find
会忽略limit
。
答案 0 :(得分:0)
find
和find_by_
是用于检索单个实例的方法。如果没有找到对象,结果是一个对象或nil。
因为该方法只应返回一个对象,所以无论您指定的限制是什么,它都会将限制设置为1.
如果您想指定限制,请根据您的示例使用。