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

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

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

我试图更好地理解究竟是如何存在的?方法在 activerecord 中有效。我得到了一些我不明白的奇怪结果......为了清楚起见,我将在这里简化我的代码。

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

1 安迪,米
2 jack ,米
3 凯茜,女
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)返回真?是不是因为限制实际上并没有改变仍然是所有男性用户的查询,而限制(1)只是一个显示的东西?我可以买这个,但是如果我只想要存在,那么正确的查询是什么?(a)返回真,而其他一切都返回假?

好的,现在这真的让我完全困惑:
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

为什么这里的一切都返回 false?我想要exists?(b) 返回true,我完全不知道为什么它不存在。如果有人能启发我,我将不胜感激。我查看了文档无济于事。

最佳答案

User.male添加 where 子句“性别 = 男性”
.exists?(a)添加一个额外的子句“id = 1”
limit 1只需添加一个 limit 1在 where 子句之后。

所以User.male.limit(1).exists?(a)会产生SELECT 1 FROM用户 WHERE用户 . id = 1 AND (gender =) LIMIT 1
所以为什么.exists?(x)有效是因为它将 id 添加到 where 子句中,从而选择了相关记录。

还有 offset(1)将不起作用,因为当您输入 exists?(x) 时,您只会获得 1 个匹配的记录。并添加一个 offset(1) 意味着它应该在那个之后查找记录。

关于sql - 是否存在关于 ActiveRecord 关系的困惑?方法,尤其是限制和偏移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12106074/

相关文章:

MySQL 查询选择 ENUM ('M' , 'F' ) 作为 'Male' 或 'Female'

ruby-on-rails - 在同一服务器上的两个不同应用程序中运行 sphinx

ruby-on-rails - 提高 ActiveRecord 查询的性能

ruby-on-rails - 在 Rails 4.2 中,如何设置带有媒体类型参数的响应 Content-Type header ?

ruby-on-rails - Rails 服务器未启动 -> 找不到 JavaScript 运行时

ruby-on-rails - 使用 `update_all` 时运行验证

activerecord - 如何在 rails 3 中自动构建关联的多态事件记录对象

mysql - 替换 LONGTEXT MySQL 中的字符串

sql - LIKE 查询的最佳 Postgres 文本索引?

mysql - 如何按天数间隔分组