0

我在这里搜索了很多,但找不到类似的主题:我需要在 Arel 中编写一个查询,因为我使用 will_paginate 来浏览结果,所以我在使用原始 SQL 实现时会感到很舒服。

这是我需要用 Arel 拼写的内容:

SELECT m.*
 FROM   messages m
 JOIN  (SELECT tmp.original_id as original_id,
               max(tmp.id) as id
        FROM   messages tmp
        WHERE  tmp.recipient_id = ?
        GROUP BY tmp.original_id) g ON (m.id = g.id)
 ORDER BY m.updated_at DESC;

简而言之:子查询检索用户的所有消息。如果一条消息有较新的回复(在回复中,我将引用消息 id 保存为 original_id),旧的将被忽略。对于所有这些消息的结果,我希望 Rails 向我提供相应的对象。

我在 SQL 方面非常熟练,但不幸的是 Arel 不熟练。任何帮助将不胜感激。

4

1 回答 1

0

这样的事情怎么样?

class Message < ActiveRecord::Base
  scope :newer_messages lambda { |num_days=10| where("updated_at > #{Time.now} - #{num_days}.days") }
end

然后,您可以为给定用户找到更新的消息,如下所示:

Message.find_by_user_id(user_id).newer_messages  
于 2012-04-21T10:47:45.293 回答