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.allShow.all 拼凑在一起。 也很好奇:看看 railscast:railscasts.com/episodes/… 我也没有获得shows.approved 的空间吗?并进行合并? 让我看看我能不能想出一个查询。你是对的,你可以添加一个范围(无论如何我都会建议)并合并,但我确信这可以通过单个查询来实现。 我跳过了几种不同的可能性,但即使只加入获得批准的shows,rails 仍然坚持执行select * 查询Channel.shows 关联。我上面的方法只产生两个查询,所以应该没问题。如果您发布一个关于如何将其简化为单个查询的新问题(或尝试 IRC),您可能会得到更好的答案。

以上是关于Active Record 包括 where的主要内容,如果未能解决你的问题,请参考以下文章

业务逻辑层-Active Record

Active Record基础

在“要求”中:没有要加载的文件 -- active_record (LoadError)

markdown 使用Active Record设置Sinatra

ruby Active Record代码示例

Active Record Query Interface 数据查询接口(界面)