在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
,而不会因为太多数据库查询而导致加载时间过长。有什么提示吗?
谢谢!
答案 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。
您需要在连接到某个帖子的电子邮件组中找到最新的电子邮件内部日期。所以你要做的是:
em
表示其他电子邮件)后来有internal_date
(em.id IS NULL
正在做的事情)internal_date
订购。