2014-05-09 89 views
0

我遇到與has_manythrough:模型有關的問題。訪問最近創建的記錄的ID並允許重複

我想要做的是在我的模型中創建2人聊天室。因此,用戶可以通過聊天消息和has_many消息進行聊天。

如何訪問最近創建的標識並允許該標識非唯一?另外,我是否有適合自己想要做的事情的設置?

@u = User.find_by_id(1) 
@u.chats.new.save <--How to get this chat id to associate with another user id? 

我的模型:

class User < ActiveRecord::Base 
    has_many :chats 
    has_many :messages, through: :chats 
end 

class Chat < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :message 
end 

class Message < ActiveRecord::Base 
    has_many :chats 
    has_many :users, through: :chats 
end 

回答

1

這是一個艱難的一個 - 我們最近使用以下設置來實現類似的東西:

#app/models/user.rb 
Class User < ActiveRecord::Base 
    #Chats 
    def messages 
     Chat.where("user_id = ? OR recipient_id = ?", id, id) # -> allows you to call @user.chats.sent to retrieve sent messages 
    end 
end 

#app/models/chat.rb #- > id, user_id, recipient_id, message, read_at, created_at, updated_at 
Class Chat < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :recipient, class_name: "User", foreign_key: "recipient_id" 

    #Read 
    scope :unread, ->(type) { where("read_at IS #{type} NULL") } 
    scope :read, ->  { unread("NOT") } 

    #Sent 
    scope :sent,  -> { where(user_id: id) } 
    scope :received, -> { where(recipient_id: id) } 
end 

這種設置使每一個chat「擁有」特定用戶。這是在您創建消息時完成的,並代表sender。每個消息只有一個recipient,您可以用recipient_id

看到那麼你就可以將新郵件發送給用戶這樣的:

@chat = Chat.new(chat_params) 

def chat_params 
    params.require(:chat).permit(:user_id, :recipient_id, :message) 
end 

這將是好的單個聊天室(IE兩個用戶之間的單個消息轉錄 - 私人消息等)。


您能否解釋您的聊天室需要如何工作?例如,如果你只有雙向聊天,你當然可以使用我的上面的代碼?但是,我覺得這是不對的;因此我想要重構或者您可以容納多個聊天室

+0

Ahhh我可以'belongs_to'兩次同一個班級嗎?太棒了...這看起來不錯。謝謝!關於我的聊天工作方式,我的目標是每個人都可以與其他人進行多對一的聊天。實際的聊天內容在移動設備上,這是我的服務器端。聊天內容可以爲空,因爲我可以開始與某人聊天而不實際發送任何消息。這看起來也可以做到這一點。與你實現的聊天方式有什麼不同,並且它是一個has_many'消息的連接表嗎? –

+0

聽起來像你真的在談論私人消息?如果您總是要將消息發送給其他用戶,那麼這些消息將永遠處於單個對話中。我所擁有的連接表和連接表之間的差異將使您可以靈活地在每次聊天中擁有多個用戶。我的設置是Facebook類型的「一對一」的消息,而一個更可擴展的系統將需要我的連接模型 –

+1

是的,我想我是在談論私人消息。這看起來不錯,我會接受你的回答。再次感謝! –

0

我敢肯定有更好的方式來做到這一點,但是這應該給你你想要的結果。

@u = User.find(1) # You can use "find" instead of "find_by_id" 
(@chat = @u.chats.new).save 
@chat.users << User.find(x) # However you want to get the other user in the chat