2016-08-29 52 views
0

一個字符has_many :conversations through: chats,以及每個對話has_many :messages。當我打電話給@character.conversations時,我希望在創建屬於對話的最新消息時對話進行排序。這是怎麼編碼的?Rails,通過雙層關聯訂購集合

character.rb

has_many :chats, foreign_key: "character_id", 
has_many :conversations, through: :chats, source: :conversation 
# order: "conversation.messages.last.created_at DESC" # doesn't work 

conversation.rb

has_many :chats, foreign_key: "conversation_id" 
has_many :characters, through: :chats, source: :character 
has_many :messages 

回答

1

您可以添加一個default_scopeconversation.rb

default_scope -> {includes(:messages).order('messages.created_at DESC')} 

注意:default_scope肯定會妨礙性能,因爲查詢將在您訪問任何對話時始終運行。更好的方法是創建一個可以在需要時調用的獨立範圍。

+0

我加了你建議** ** conversation.rb的default_scope,但它似乎沒有以影響對話的順序,而是在每個對話內排序消息。我希望它自己訂購對話? – Bazley

+0

@Bazley你可以做'@ character.conversations'併發布生成的** SQL **嗎?你可以在你的控制檯中試試這個,看看'ORDER BY messages.created_at DESC'子句。 – dp7

0

您可以申請其他範圍的關係,即使是多層:

@character.conversations.joins(:messages).order('messages.created_at DESC')