Ruby on rails Rails 4:按子项的最新日期订购型号

Ruby on rails Rails 4:按子项的最新日期订购型号,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,在Rails 4中,我有一个模型线程,其中有许多电子邮件。每封电子邮件都有一个名为internal\u date的字段。我想返回一组线程,按照最新的email.internal_date线程优先的方式排序(与Gmail对收件箱的排序非常相似) 这是我的控制器中的当前行(目前尚未订购): @threads=selected_threads.join(:tags).filter(params_filters).includes(:email,[一些其他内容]).distinct.all.pagina

在Rails 4中,我有一个模型
线程
,其中
有许多
电子邮件
。每封
电子邮件
都有一个名为
internal\u date
的字段。我想返回一组线程,按照最新的
email.internal_date
线程优先的方式排序(与Gmail对收件箱的排序非常相似)

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

@threads=selected_threads.join(:tags).filter(params_filters).includes(:email,[一些其他内容]).distinct.all.paginate(page:params[:page],:per_page=>10)

由于过滤,我正在进行
连接
;并使用
包含
来加快速度

理想情况下,我会在我的
线程
模型中添加一封scope
order\u by\u latest\u电子邮件
,而不会因为太多的数据库查询而浪费加载时间。有什么建议吗


谢谢

我认为只有这样一个非常难看的查询才有可能:

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
Thread.joins(:电子邮件)
.select('threads.*,email.internal_date')
.joins('LEFT OUTER JOIN emails em ON(emails.internal_date
您可以在一篇博客文章中看到详细信息,但这是一个半常见的sql问题,称为每个组最大n

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

  • 将所有电子邮件相互比较
  • 继续,直到您找到一封没有其他电子邮件(其中
    em
    表示该其他电子邮件)具有更晚的
    内部\u日期的电子邮件(这就是
    em.id为NULL
    正在执行的操作)
  • 按该电子邮件的
    内部\u日期
    订购

  • 谢谢,那正是我想要的!可惜我们需要这样一个难听的问题。谢谢!你救了我一天。