如何将LIMIT / ORDER条件应用于ActiveRecord Join?

时间:2016-08-11 22:48:20

标签: ruby-on-rails ruby-on-rails-4 activerecord

目前,我有Conversation has many Messages关系和User has many Conversations关系。

我想创建一个ActiveRecord查询来获取用户拥有的每个会话的最后消息

我们说我在数组中有对话 ids ...

ids = [24, 22, 23]

此查询:

Message.where(conversation_id: ids).joins(:conversation).order(created_at: :desc)

...就所有用户的对话都返回所有消息而言是正确的。

使用上面的相同查询,如果我映射conversation_id的数组:

Message.where(conversation_id: ids).joins(:conversation).order(created_at: :desc).map(&:conversation_id)

我得到一个这样的数组:[24, 24, 22, 22, 23, 22]告诉我会话中有3条消息,其中conversation_id = 22,2条消息,其中conversation_id = 24,1根,conversation_id = 23。

这很好,但现在我的问题是,如何创建ActiveRecord查询以从每个对话中获取一条消息? (最后一个创建)

我认为我必须使用limit() / order()方法,但我不知道该怎么做,对我来说有点太高级了。

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

joins可以接受字符串,您可以将所需的任何连接指定为纯文本。请参阅doco

示例:

User.joins("LEFT JOIN bookmarks ON bookmarks.bookmarkable_type = 'Post' AND bookmarks.user_id = users.id")
# SELECT "users".* FROM "users" LEFT JOIN bookmarks ON bookmarks.bookmarkable_type = 'Post' AND bookmarks.user_id = users.id

关于加入最新记录的问题,这是另一个问题,并且在stackoverflow here上有答案。

示例:

SELECT  c.*, p.*
FROM    customer c INNER JOIN
        (
            SELECT  customer_id,
                    MAX(date) MaxDate
            FROM    purchase
            GROUP BY customer_id
        ) MaxDates ON c.id = MaxDates.customer_id INNER JOIN
        purchase p ON   MaxDates.customer_id = p.customer_id
                    AND MaxDates.MaxDate = p.date