0

我需要用用戶消息(對話框)構建應用程序。 我已經通過這種方式解決了這個問題:Rails方式用戶對話

應用程序/模型/ conversation.rb

class Conversation < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :interlocutor 
    has_many :messages 
end 

應用程序/模型/ message.rb

class Message < ActiveRecord::Base 
    belongs_to :conversation 
    belongs_to :user 
    attr_accessible :message 
end 

應用程序/ models/user.rb

class User < ActiveRecord::Base 
    ... 
    def conversations 
    Conversation.uniq.joins(:messages) 
     .where("conversations.user_id = ?", self.id) 
     .where("conversations.interlocutor_id = ?", self.id) 
     .order("messages.created_at DESC") 
    end 
end 

我很困惑對話方法。這就像PHP方式 - 沒有靈活性。

它可以通過rails方式重寫嗎?也許它可能是AR關係?

謝謝。

回答

2

考慮scoping查詢。

在Rails 3,這看起來像

class Conversation < ActiveRecord::Base 
    scope :involving, lambda do |user| 
    joins(:messages) 
     .where("conversations.user_id = ?", user.id) 
     .where("conversations.interlocutor_id = ?", user.id) 
     .order("messages.created_at DESC") 
    end 
end 

使用方法如下:

​​
2

爲什麼不是User有很多Conversations?這是很有道理的,我...

class User < ActiveRecord::Base 
    ... 
    has_many :conversations 
end 

此外,您已經說一個Conversationbelongs_to一個User!你沒有完成另一半的關係...

+0

對話foreign_key可以user_id說明或interlocutor_id(user_id是用戶的ID,誰已經開始對話,interlocutor_id是對話的對話者的ID)。所以我需要合併用戶的所有對話(這意味着無論誰開始對話)。 –

+0

嗯..我也不確定我是否從我的第一語言中正確地翻譯了單詞「interlocutor」。它的意思是「談話的另一個成員」:) –