Ruby on rails 这个ActiveRecord';其中';条款工作?

Ruby on rails 这个ActiveRecord';其中';条款工作?,ruby-on-rails,activerecord,rails-activerecord,Ruby On Rails,Activerecord,Rails Activerecord,我有以下声明: myuser.orders.exists?(['(orderstatus = ?) ', statusid]) 它返回true,因为存在与statusid匹配的orderstatus 接下来我有: myuser.orders.where('id not in (?)', nil).exists?(['(orderstatus = ?) ', statusid]) 这将返回false,我认为它可能会返回true,因为没有为零的id 那么我有: myuser.orders.whe

我有以下声明:

myuser.orders.exists?(['(orderstatus = ?) ', statusid])
它返回true,因为存在与statusid匹配的orderstatus

接下来我有:

myuser.orders.where('id not in (?)', nil).exists?(['(orderstatus = ?) ', statusid])
这将返回false,我认为它可能会返回true,因为没有为零的id

那么我有:

myuser.orders.where(nil).exists?(['(orderstatus = ?) ', statusid])
这是真的


我的问题是为什么中间的语句返回false?它不会抱怨或抛出任何错误。我猜我用错了nil,但是有人能解释一下吗?

您在SQL的NULL上遇到了问题。<代码>中< <代码>中:

where('id not in (?)', nil)
成为以下SQL:

id not in (null)
这相当于:

id != null
但是
id!=null
既不为true也不为false,结果为null,布尔上下文中的null为false;实际上,
x=null
x!=null
导致所有
x
为null(即使
x
本身为null);例如,在PostgreSQL中:

=> select coalesce((11 = null)::text, '-NULL-');
 coalesce 
----------
 -NULL-
(1 row)

=> select coalesce((11 != null)::text, '-NULL-');
 coalesce 
----------
 -NULL-
(1 row)

=> select coalesce((null = null)::text, '-NULL-');
 coalesce 
----------
 -NULL-
(1 row)

=> select coalesce((null != null)::text, '-NULL-');
 coalesce 
----------
 -NULL-
(1 row)
MySQL和其他所有合理兼容的数据库都会做同样的事情(可能有不同的强制转换要求,以使空值变得明显)

结果是
where(id not in(?)、nil)
总是生成一个空集,并且您的存在性检查总是会在空集上失败

如果您想说“id不为空的所有行”,那么您想说:

where('id is not null')
如果您的
id
是一个主键(几乎可以肯定是这样),那么
id
将永远不会为空,您可以将
完全保留在那里


当你手拿
时,其中
只有一个

where(nil)

where
的参数解析逻辑将完全忽略
nil
where(nil)
将与
where()
相同,
where()
对查询完全不做任何操作。结果是,就数据库而言,第一个查询和第三个查询是相同的。

SQL的NULL有问题。<代码>中< <代码>中:

where('id not in (?)', nil)
成为以下SQL:

id not in (null)
这相当于:

id != null
但是
id!=null
既不为true也不为false,结果为null,布尔上下文中的null为false;实际上,
x=null
x!=null
导致所有
x
为null(即使
x
本身为null);例如,在PostgreSQL中:

=> select coalesce((11 = null)::text, '-NULL-');
 coalesce 
----------
 -NULL-
(1 row)

=> select coalesce((11 != null)::text, '-NULL-');
 coalesce 
----------
 -NULL-
(1 row)

=> select coalesce((null = null)::text, '-NULL-');
 coalesce 
----------
 -NULL-
(1 row)

=> select coalesce((null != null)::text, '-NULL-');
 coalesce 
----------
 -NULL-
(1 row)
MySQL和其他所有合理兼容的数据库都会做同样的事情(可能有不同的强制转换要求,以使空值变得明显)

结果是
where(id not in(?)、nil)
总是生成一个空集,并且您的存在性检查总是会在空集上失败

如果您想说“id
不为空的所有行”,那么您想说:

where('id is not null')
如果您的
id
是一个主键(几乎可以肯定是这样),那么
id
将永远不会为空,您可以将
完全保留在那里


当你手拿
时,其中
只有一个

where(nil)

where
的参数解析逻辑将完全忽略
nil
where(nil)
将与
where()
相同,
where()
对查询完全不做任何操作。结果是,就数据库而言,第一个和第三个查询是相同的。

在日志中查看第二个语句生成的查询。如果没有对你的问题做出解释,也可以在这里发布。在日志中查看第二条语句生成的查询。如果它不能解释你的问题,也可以在这里发布。谢谢,这很有意义。谢谢你解释清楚。谢谢,这很有道理。谢谢你解释清楚。