数据库
首页 > 数据库> > Active Record NOT IN查询和MySQL的NULL

Active Record NOT IN查询和MySQL的NULL

作者:互联网

我有一个查询,如:

Tag.where('id not IN (?)', current_user.tags.pluck(:id)).uniq

什么时候

current_user.tags.pluck(:id)).uniq

返回NULL,我没有从Tag查询中得到任何结果,这不是期望的行为.

我在这里做错了什么?

谢谢.

解决方法:

我不认为current_user.tags.pluck(:id)返回nil,而是返回空数组.在这种情况下为ActiveRecord will treat an empty array as a NULL.结果是一些像这样的荒谬的SQL:

select tags.* from tags where id in (null)

由于SQL的NULL的特质(特别是x = NULL和x!= NULL都对所有x均为false),因此WHERE子句中的in(空)或not in(空)将不匹配任何内容.

Rails将Ruby的[]转换为NULL是非常愚蠢的(在over here上进行了更多讨论),但是即使它足够聪明以引发异常,您仍然必须手动处理“空数组”情况,如下所示:

tag_ids = current_user.tags.pluck(:id)
if(tag_ids.empty?)
  tags = Tag.all
else
  tags = Tag.where('id not in (?)', tag_ids)
end

而且您不需要那里的uniq,SQL in运算符会将其RHS视为一个集合,因此重复项将在后台隐藏.

标签:activerecord,rails-activerecord,ruby-on-rails-3,ruby-on-rails,mysql
来源: https://codeday.me/bug/20191122/2062059.html