目前我有一个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