Rails 4:根据孩子

时间:2015-10-25 23:20:24

标签: ruby-on-rails activerecord

在Rails 4中,我有一个Thread has_many的模型Emails。每个Email都有一个名为internal_date的字段。我想返回一个线程集合,以最新email.internal_date线程的方式排序(非常类似于Gmail对其收件箱进行排序的方式)。

这是我控制器中的当前行(目前尚未订购):

@threads = selected_threads.joins(:tags).filter(params_filters).includes(:emails, [some other stuff]).distinct.all.paginate(page: params[:page], :per_page => 10)

由于过滤,我正在执行joins;并使用includes来加快速度。

理想情况下,我会在我的order_by_latest_email模型中添加范围Thread,而不会因为太多数据库查询而导致加载时间过长。有什么提示吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

我认为只有这样一个非常丑陋的查询才能实现:

Thread.joins(:emails)
  .select('threads.*, emails.internal_date')
  .joins('LEFT OUTER JOIN emails em ON (emails.internal_date < em.internal_date and emails.thread_id = em.thread_id)')
  .where('em.id IS NULL').order('emails.internal_date DESC')
  # additional filters here

您可以在博文here中查看详细信息,但这是一个半常见的SQL问题,称为每个组中最大的n。

您需要在连接到某个帖子的电子邮件组中找到最新的电子邮件内部日期。所以你要做的是:

  1. 将所有电子邮件相互比较
  2. 继续,直到找到其中没有其他电子邮件(其中em表示其他电子邮件)后来有internal_dateem.id IS NULL正在做的事情)
  3. 通过该电子邮件internal_date订购。
相关问题