目前,我有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()
方法,但我不知道该怎么做,对我来说有点太高级了。
提前感谢您的帮助。
答案 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