2011-12-06 42 views
5

Tôi có hai mô hình sau:Rails luồng nhắn tin

class Message < ActiveRecord::Base 
    belongs_to :to_user, :class_name => 'User' 
    belongs_to :from_user, :class_name => 'User' 

    has_ancestry #Using the 'ancestry' gem 
end 

class User < ActiveRecord::Base 
    has_many :messages_received, :class_name => 'Message', :foreign_key => 'to_user_id' 
    has_many :messages_sent, :class_name => 'Message', :foreign_key => 'from_user_id' 
end 

Mỗi người dùng được phép có một cuộc trò chuyện với một người dùng khác và tất cả các thư trả lời nên được luồng từ thư gốc.

Trong hành động của bộ điều khiển 'chỉ mục', tôi làm cách nào để truy vấn cả tin nhắn đã gửi và tin nhắn đã nhận? Ví dụ: nếu User1 truy cập '/ users/2/messages /' họ sẽ thấy toàn bộ cuộc hội thoại giữa user1 và user2 (bất kể ai đã gửi thư đầu tiên). Tôi có cần phải thêm một mô hình 'Chủ đề' hoặc có cách nào để thực hiện điều này với cấu trúc hiện tại của tôi không?

Cảm ơn.

Trả lời

16

Bạn có thể nên chuyển đổi cơ cấu này thành cuộc trò chuyện mà bạn có thể tham gia với mọi người hơn là một chuỗi các thư được kết nối với nhau trong một chuỗi. Ví dụ:

class Conversation < ActiveRecord::Base 
    has_many :messages 
    has_many :participants 
    has_many :users, :through => :participants 
end 

class Message < ActiveRecord::Base 
    belongs_to :conversation 
end 

class Participant < ActiveRecord::Base 
    belongs_to :conversation 
    belongs_to :user 
end 

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

Khi một thông điệp được gửi đến một ai đó, tạo ra một cuộc trò chuyện với nó và mời các bên phù hợp bằng cách thêm chúng vào danh sách users.

Nhắn tin theo chuỗi có thể được thêm vào đây bằng cách xây dựng mối quan hệ cha mẹ vào Bản thân thư hoặc sử dụng tổ tiên, mặc dù trong thực tế điều này có xu hướng bị giết quá mức theo thứ tự thời gian trả lời đơn giản thường đủ cho hầu hết mọi người.

Để theo dõi trạng thái đọc/chưa đọc, bạn sẽ cần một bảng liên kết giữa người dùng và tin nhắn trực tiếp và điều này có thể phức tạp, vì vậy hãy tránh nó trừ khi bạn cần.

Hãy nhớ rằng một số tên được bảo lưu bởi Ruby hoặc Rails và Thread là một trong số chúng, vì vậy bạn không thể có mô hình với tên đó.

+1

Đã tìm cách tạo cuộc hội thoại đơn giản giữa 2 người dùng khi tôi tìm thấy điều này. Có vẻ như nó sẽ hoạt động. Cảm ơn! Nhưng không nên là 'has_many: cuộc hội thoại,: qua =>: người tham gia' trong Mô hình người dùng? – Vickash

+1

Bạn đang đúng về thiếu ': qua' trong mô hình Người dùng. Nó cũng phải có 'has_many: particip'. – tadman

+0

Tôi vừa mới sử dụng mô hình này trong ứng dụng của mình nhưng tôi thực sự đang gặp khó khăn để có được một bộ điều khiển được viết để tạo và trả lời tin nhắn. Có cơ hội của một ví dụ đơn giản không? Tôi có thể bắt đầu nó như một câu hỏi mới nếu điều đó tốt hơn. – Dave