与find_by_id一起使用时限制被忽略

时间:2013-05-14 06:19:08

标签: ruby-on-rails-3 model rails-activerecord

我试图通过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_idfind会忽略limit

1 个答案:

答案 0 :(得分:0)

findfind_by_是用于检索单个实例的方法。如果没有找到对象,结果是一个对象或nil。

因为该方法只应返回一个对象,所以无论您指定的限制是什么,它都会将限制设置为1.

如果您想指定限制,请根据您的示例使用。