最近在项目上实际使用我用 go 写的 ORM 的时候发现一个问题
db.Where("id NOT IN (?)", array) , 如果是数组为空,返回的结果竟然为 0, 我看了下生成的 SQL 是类似于这样:
SELECT * FROM USERS WHERE ID NOT IN (NULL); // 这样子的SQL,mysql 会返回空值
我突然好奇,Rails 的 ActiveRecord 是怎么实现的。。。难道会 scan 一下 where 条件来判断,因为我印象中没有发现过这个问题。。。
可是,试了一下竟然发现,如果条件为空数组是话,Rails 竟然也会返回一个空值。。。而不是我想象中全部返回
User.where("id NOT IN (?)", [])
搜索了一下,竟然发现 Ruby China 没有人提过这个事情。。。。。不知道是大家都知道呢,还是都没有注意过。。。
然后看了下,推荐的做法就是:
Rails 4:
where.not(id: ids)
之前的 Rails 版本就只能自己写 scope 处理了,例如
scope :excluding_ids, lambda { |ids|
where(['id NOT IN (?)', ids]) if ids.any?
}
不过这样子只针对 ID。。。其它的字段,一个一个写 scope 吧。。。或者写个方法
当然我也更新了下我的 go 的 ORM。。。加上了 Not 方法,类似这样子。。。
db.Not(ids).First(&user)
db.Not("name", names).First(&user)