2016-08-11 38 views
0

目前我有Conversation has many Messages的關係,和User has many Conversations的關係。如何將限制/訂單條件應用於ActiveRecord加入?

我想創建一個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],告訴我有與conversation_id = 22,2會話3個消息會話標識= 24的消息1,會話標識= 23的消息。

這很好,但現在我的問題現在是,如何創建一個ActiveRecord查詢以從每個對話中獲取一條消息? (最後一個被創建)

我假設我必須使用limit()/order()方法,但我不知道該怎麼做,這對我來說有點太高級了。

感謝您的提前幫助。

回答

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 

至於加入到最新記錄的問題,這是在它自己的權利另一個問題,並且對計算器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 
+0

快速的問題,這是否解決方案適用,如果我想要檢索的N最後一個記錄? – jlstr

+0

說實話,我的頭頂我不確定你會怎麼做 –

+0

謝謝你的回答。看起來這個問題並不是一個簡單的解決方案,至少沒有一個不依賴於將SQL寫入/嵌入到Ruby中的方法,這很不幸。 – jlstr