Ruby on rails 如何在Activerecord中优化select查询?

Ruby on rails 如何在Activerecord中优化select查询?,ruby-on-rails,ruby,activerecord,ruby-on-rails-3.2,Ruby On Rails,Ruby,Activerecord,Ruby On Rails 3.2,我想看看是否有更好的方法来编写下面的ActiveRecord查询 @posts = Post.select {|x| x.section.nil?} 我使用这个查询所做的是搜索帖子,然后只选择那些不再有相关节且处于孤立状态的帖子 有更好的方法吗?我使用的是rails 3.2 非常感谢 这应该有效: Post.joins('left outer join sections on sections.id = posts.section_id').where('sections.id is nul

我想看看是否有更好的方法来编写下面的ActiveRecord查询

@posts = Post.select {|x| x.section.nil?} 
我使用这个查询所做的是搜索帖子,然后只选择那些不再有相关节且处于孤立状态的帖子

有更好的方法吗?我使用的是rails 3.2

非常感谢

这应该有效:

Post.joins('left outer join sections on sections.id = posts.section_id').where('sections.id is null and posts.section_id is not null')
或以较短的方式,使用:


Post.where(:section\u id=>nil)
是的,这行不通,因为:section\u id不是真的为零。它实际上有一个孤立的节id。在上面的代码中,它通过检查节的id并返回包含不存在节的文章来检查节是否存在。尝试此
Post.includes(:section)。其中(:section=>{:id=>nil})
@Sontya,因为您使用的是includes(用于快速加载),您还必须添加对该表的引用,才能对包含的表进行查询。是。因此,如果OP在
Post
model
中有类似的内容,那么
Post.includes(:section)
应该可以工作得很好!第一个选项很有魅力!谢谢您的帮助。@MikeR第二个选项也应该完成它的工作-而且看起来更好,因为您不必自己构建
join
子句。出于某种原因,第二个选项不起作用。这就是我得到的:#我先用第一个。再次感谢您的帮助。@MarekLipka,为什么我需要明确说明as includes/eager_load为我提供的左侧外部连接?@MikeR这里不起作用,因为默认情况下,
includes
会创建两个SQL查询来获取记录,并且只有当它知道您要在另一个表上给出
where
子句时,才会使用
outer join
子句创建单个查询。由于
where
中的子句在这里是string,Rails无法知道您要在其中使用哪些表,因此它会创建默认的不带join的两个DB查询,这就产生了一个错误。
Post.eager_load(:section).where('sections.id is null and posts.section_id is not null')