【问题标题】:Active Record includes with whereActive Record 包括 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') 只返回已获批的频道,跳过未获批内容的频道;但是无论节目的状态如何,我都需要频道返回,但他们的节目是空数组。

【问题讨论】:

标签: ruby-on-rails ruby activerecord ruby-on-rails-4 rails-activerecord


【解决方案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),您可能会得到更好的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-27
  • 1970-01-01
  • 2015-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多