关于ActiveRecord关系的困惑存在吗?方法,尤其是限制和偏移

时间:2012-08-24 08:52:23

标签: sql ruby-on-rails activerecord ruby-on-rails-3.2

我正在运行Rails 3.2.8和ruby 1.9.3p194。

我想更好地了解存在的确切方式?方法适用于activerecord。我得到了一些我不明白的奇怪结果......为了清楚起见,我将在这里简化我的代码。

想象一下,我有一个包含用户列表的用户模型。

1安迪,m
2杰克,m
3凯茜,f
4迈克,米

我有男性的范围,所以:

User.male => [#< User id: 1, name: Andy, gender: male>, #< User id: 2, name: Jake, gender: male>, #< User id: 4, name: Mike, gender: male>]

行。现在:

a = User.find 1 => #<User id: 1, name: Andy, gender: male>  
b = User.find 2 => #<User id: 2, name: Jake, gender: male> 
c = User.find 3 => #<User id: 3, name: Cathy, gender: female> 
d = User.find 4 => #<User id: 4, name: Mike, gender: male> 

User.male.exists?(a) => true  
User.male.exists?(b) => true  
User.male.exists?(c) => false  
User.male.exists?(d) => true  

好的,这是有道理的。但是:

User.male.limit(1) => [#<User id: 1, name: Andy, gender: male>]

User.male.limit(1).exists?(a) => true  
User.male.limit(1).exists?(b) => true  
User.male.limit(1).exists?(c) => false  
User.male.limit(1).exists?(d) => true  

为什么存在?(b)存在?(d)返回true?是因为限制实际上并没有改变仍然是所有男性用户的查询,而limit(1)只是一个显示器吗?我可以买这个,但是如果我只想存在,那么正确的查询是什么?(a)返回true,其他一切都返回false?

好的,现在这真让我感到困惑:

User.male.limit(1).offset(1) => [#<User id: 2, name: Jake, gender: male>]  

User.male.limit(1).offset(1).exists?(a) => false
User.male.limit(1).offset(1).exists?(b) => false
User.male.limit(1).offset(1).exists?(c) => false
User.male.limit(1).offset(1).exists?(d) => false

为什么这里的一切都归零?我想存在吗?(b)返回true,我根本无法弄明白为什么它不存在。如果有人能够启发我,我将非常感激。我查看文档无济于事。

1 个答案:

答案 0 :(得分:1)

User.male添加了where子句“gender = male”

.exists?(a)添加了一个额外的条款“id = 1”

limit 1只需在where子句后添加limit 1

所以User.male.limit(1).exists?(a)会生成 SELECT 1 FROM {用户{1}} {用户{1}} ID为WHERE.

因此= 1 AND (gender =工作的原因是因为它将id添加到where子句中,从而选择相关记录。

) LIMIT 1也不起作用,因为当您放置.exists?(x)并且向其添加偏移量(1)时,您只获得1个匹配记录,这意味着它应该在那之后查找记录