如何用ActiveRecord / Rails表达NOT IN查询?
只是为了更新这个,因为似乎有很多人来到这里,如果你使用Rails 4,请查看TrungLê`和VinniVidiVicci的答案。
Topic.where.not(forum_id:@forums.map(&:id))
Topic.where(published:true).where.not(forum_id:@forums.map(&:id))
我希望有一个简单的解决方案,不涉及find_by_sql
,如果没有,那么我想这将必须工作。
我发现这篇文章引用了这个:
Topic.find(:all, :conditions => { :forum_id => @forums.map(&:id) })
这是一样的
SELECT * FROM topics WHERE forum_id IN (<@forum ids>)
我想知道是否有办法做NOT IN
,如:
SELECT * FROM topics WHERE forum_id NOT IN (<@forum ids>)
没有找到相关结果
已邀请:
15 个回复
亲奋漏
其中
是一个数组:
编辑: 对于Rails 4表示法:
倪蕊悲潍
语法:
姬第柔炒
你可能需要做
。我不记得Rails是否会将参数转换为CSV列表(如果它是可枚举的)。 你也可以这样做:
豆兢
或者,如果愿意:
并且因为导轨4上:
请注意,最终你不希望forum_ids成为id列表,而是一个子查询,如果是这样,那么在获取主题之前你应该做这样的事情:
通过这种方式,您可以在一个查询中获得所有内容:类似于:
还要注意,最终你不想这样做,而是一个连接 - 可能更有效。
公藕
你可以更进一步。 如果您需要先过滤已发布的主题,然后过滤掉您不想要的ID,则可以执行以下操作:
Rails 4让它变得如此简单!
凡夕
为空,则接受的解决方案将失败。要解决这个问题,我必须这样做
或者,如果使用Rails 3+:
窝头菊
催备南菠亨
......可以这样表达:
Railscasts的Ryan Bates创建了一个很好的截屏视频,解释了MetaWhere。 不确定这是否是您正在寻找的东西,但在我看来它肯定比嵌入式SQL查询更好。
冲汉
哪个比做SQL更有效率
瞧叮
扑北爱
玩翁文醚碱
桔马牛
使用pluck而不是映射元素 通过railsconf 2012发现10件你不知道rails可以做的事情
梦砍废么
如果操作可以是空数组或空数组。
告耸
范围中的前两个方法是声明别名cavtl1和tl1的其他范围。 &LT;&LT;是不是在运营商的口号。 希望这有助于某人。