如何在ActiveRecord Join中应用LIMIT/ORDER条件?



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

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

假设我有对话id 在数组中…

ids = [24, 22, 23]
这个查询:

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

…是正确的,因为它返回所有用户对话中的所有消息。

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

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()方法,但我不知道如何做到这一点,这对我来说有点太高级了。

提前感谢您的帮助

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上有答案。

的例子:

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

最新更新