Rails 3中私有消息建模的首选方法

时间:2011-02-27 00:50:29

标签: ruby-on-rails ruby ruby-on-rails-3

我计划在成员之间实现私人消息系统。我想知道这是什么首选方法。

要求是

  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那么,另一个人将回复发件人= 10 to_id = 5。这应该被视为并理解为相同的会话对象。


  4. 关于最后一点。我不确定什么是首选的建模方法。

    最好使用一个Conversation模型来处理所有消息,例如

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

    或者首选创建一个Conversation模型来处理关联和消息的消息模型。

    我想看看如何实现这种关系的示例,以及是否有其他方法可以实现。

    我在这里有点失落。

4 个答案:

答案 0 :(得分:12)

更简单的模型是捕获每条消息:

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')

答案 1 :(得分:4)

acts_as_messageable有点长,但应该给你一些想法。

答案 2 :(得分:2)

如果您使用此数据库模型:

User id:integer ....

Message id:integer body:string

UserMessages id:integre sender_id:integer to_id:integer message_id

我猜你需要提供:finder_sql in: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

答案 3 :(得分:1)

如果你,我会选择使用IMAP而不是使用数据库进行此类建模。

查看this了解详情。