Предпочтительный способ моделирования личных сообщений в Rails 3 - PullRequest
7 голосов
/ 27 февраля 2011

Я планирую внедрить систему личных сообщений между участниками.Мне интересно, каковы предпочтительные подходы к этому.

Требования:

  1. Я должен быть в состоянии легко получить их как-то так

    @user.conversations               #Should return User objects that I sent or received messages from (but not me)
    @user.conversations.messages      #Messages from all or specific user objects.
    @user.conversations.messages.unread      #Unread messages
    
  2. При вызове @ user.conversations следует извлекать только людей, отправивших мне сообщения, или людей, которым я отправляю сообщения.current_user должен быть исключен.

  3. Если я sender_id = 5 и отправлю to_id = 10, тогда другой человек ответит как sender = 10 to_id = 5.Это следует рассматривать и понимать как один и тот же объект разговора.


Относительно последнего пункта.Я не уверен, какой предпочтительный подход к моделированию.

Предпочтительно использовать одну модель беседы для обработки всех сообщений, такую ​​как

    attr_accessible :user_id, :friend_id, :message, :read
    belongs_to :user

Или предпочтительнее создать модель беседы для обработки ассоциации и модель сообщения для сообщений.

Я хотел бы увидеть примеры того, как реализовать это отношение и есть ли дополнительный метод для реализации.

Я немного растерялся здесь.

Ответы [ 4 ]

12 голосов
/ 27 февраля 2011

Гораздо более простая модель - захватывать каждое сообщение:

class Message < ActiveRecord::Base
  belongs_to :from_user,  :class_name => 'User' # from_user_id field fk Users
  belongs_to :to_user,    :class_name => 'User' # to_user_id field fk Users
  belongs_to :thread, :class_name => 'Message'  # Reference to parent message
  has_many :replies,  :class_name => 'Message', :foreign_key => 'thread_id'

  named_scope :in_reply_to, lambda { |message| :conditions => {:thread => message}, :order => 'created_at' }
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

Если вам нужно захватить цепочки сообщений, любое сообщение, являющееся ответом, может хранить ссылку на исходное сообщение, начинающее разговор (иначе говоря: поток).Например:

first_msg   = Message.new(:to_user => bob, :from_user => sally, :body => 'Hello!')
sally_reply = first_msg.replies.build(:to_user => bob, :from_user => sally, :body => 'hi back')
bob_reply   = first_msg.replies.build(:to_user => sally, :from_user => bob, :body => 'later')
4 голосов
/ 27 февраля 2011

acts_as_messageable немного длиннее в зубе, но должно дать вам несколько идей.

2 голосов
/ 27 февраля 2011

Если вы используете эту модель БД:

User id:integer ....

Message id:integer body:string

UserMessages id:integre sender_id:integer to_id:integer message_id

Полагаю, вам нужно будет указать: finder_sql в: has_many, что-то вроде этого

class User < ActiveRecord::Base
   has_many :conversations, :class_name => "UserMessage", :finder_sql =>
      'SELECT * ' +
      'FROM user_messages' +
      'WHERE sender_id = #{id} OR to_id = #{id} ' 

end
1 голос
/ 27 февраля 2011

Если бы вы были, я бы пошел с IMAP вместо использования БД для такого моделирования.

Проверьте это для более подробной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...