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