Active Record 包括 where
Posted
技术标签:
【中文标题】Active Record 包括 where【英文标题】:Active Record includes with where 【发布时间】:2013-10-11 17:44:37 【问题描述】:我在获取查询语法时遇到问题:
我有频道,其功能类似于博客中的“类别”。我有类似帖子的节目。 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')
只返回已获批的频道,跳过未获批内容的频道;但是无论节目的状态如何,我都需要频道返回,但他们的节目是空数组。
【问题讨论】:
您需要使用外连接。检查此 SO 链接:***.com/questions/1509692/… 你的意思是这样?Channel.includes(:shows).where(:shows => []).order('channels.position')
【参考方案1】:
我个人会使用 Ruby(仍然需要精通一些 SQL):
channels = Channel.includes(:shows).order('channels.position')
channels.each |c| c.shows.keep_if(&:approved?)
【讨论】:
呵呵;这不会产生更多的查询开销吗?我遇到的部分问题(作为一个红宝石新手)是我使用默认的 Model.all 发送了太多的查询,只是试图清理/加快我正在做的事情。 我建议您在执行时监控日志以确保。如果Channel.includes(:shows)
产生的查询过多,您可以将所需的结构与Channel.all
和Show.all
拼凑在一起。
也很好奇:看看 railscast:railscasts.com/episodes/… 我也没有获得shows.approved 的空间吗?并进行合并?
让我看看我能不能想出一个查询。你是对的,你可以添加一个范围(无论如何我都会建议)并合并,但我确信这可以通过单个查询来实现。
我跳过了几种不同的可能性,但即使只加入获得批准的shows
,rails 仍然坚持执行select *
查询Channel.shows
关联。我上面的方法只产生两个查询,所以应该没问题。如果您发布一个关于如何将其简化为单个查询的新问题(或尝试 IRC),您可能会得到更好的答案。以上是关于Active Record 包括 where的主要内容,如果未能解决你的问题,请参考以下文章
在“要求”中:没有要加载的文件 -- active_record (LoadError)