1

我无法获取查询的语法:有效记录包含在哪里

我有渠道,其功能类似于博客中的“类别”。我有展示这是像帖子。一个Show有一个布尔型的“批准”,所以它是真或假。频道也有一个位置..频道有很多节目。

如何通过位置顺序获取所有通道,只显示只有通过= true的通道?

我尝试这样:Channel.includes(:shows).order('channels.position')那让我渠道在正确的位置,虽然我已经可以做到channel.shows,它变得分配到通道不管show.approved=true与否的所有节目。

Channel.includes(:shows).order('channels.position')返回所有频道和节目,无论节目是否获得批准。

Channel.includes(:shows).where(shows:{approved: true}).order('channels.position')仅返回已批准的频道,跳过没有批准内容的频道;但是无论显示状态如何,我都需要返回通道,但显示为空阵列。

+0

您需要使用外连接。检查此SO链接:http://stackoverflow.com/questions/1509692/rails-activerecord-joins-with-left-join-instead-of-inner-join – mcfinnigan

+0

你的意思是这样的? 'Channel.includes(:shows).where(:shows => [])。order('channels.position')' – depa

回答

1

我个人使用Ruby(尚需磨砺了一些SQL):

channels = Channel.includes(:shows).order('channels.position') 

channels.each { |c| c.shows.keep_if(&:approved?) } 
+0

呵呵;并且不会再做更多的查询开销?我遇到的问题(作为ruby新手)的一部分是我使用默认的Model.all发送太多查询,只是试图清理/加速我正在做的事情。 – grimmwerks

+0

我建议你监视日志,因为你正在执行,以确保。如果'Channel.includes(:shows)'产生了太多的查询,你可以用'Channel.all'和'Show.all'拼凑你想要的结构。 –

+0

也好奇:看看railscast:http://railscasts.com/episodes/215-advanced-queries-in-rails-3?view=asciicast我是否也没有获得shows.approved的范围?并做一个合并? – grimmwerks