Ruby on rails Rails 4:按子项的最新日期订购型号
在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
线程
,其中有许多电子邮件
。每封电子邮件
都有一个名为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)
由于过滤,我正在进行连接
;并使用包含
来加快速度
理想情况下,我会在我的线程
模型中添加一封scopeorder\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日期
订购
谢谢,那正是我想要的!可惜我们需要这样一个难听的问题。谢谢!你救了我一天。