像facebook这样的收件箱邮件

时间:2012-08-27 15:39:56

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

我正在尝试创建一个个人收件箱邮件系统,但我想起了几个问题。首先让我解释一下我的系统。

这是我的桌子型号

  create_table "inboxmessages", :force => true do |t|
    t.integer  "receiver_id"
    t.integer  "sender_id"
    t.integer  "message_id"
    t.boolean  "isread"
    t.boolean  "isstarred"
    t.datetime "created_at",  :null => false
    t.datetime "updated_at",  :null => false
  end

  create_table "messages", :force => true do |t|
    t.string   "subject"
    t.text     "body"
    t.datetime "created_at", :null => false
    t.datetime "updated_at", :null => false
  end

关系将遵循

inboxmessages
  belongs_to :message
  belongs_to :user, :class_name => "User", :foreign_key => "sender_id"
  belongs_to :user, :class_name => "User", :foreign_key => "receiver_id"
messages
  has_many :inboxmessages
user
  has_many :inboxmessages

我有他的问题我不确定如何创建一个允许我多个用户的消息。这里是我想要的形式的架构

Message.subject
Inboxmessage.receiver # but have multiple different user
------------------------------------------------------------------------
Message.body
Inboxmessage.sender = current_user # hidden field

以下是关于构建此模型/控制器/应用程序的问题

1 - Should my new form be in inboxmessages or messages?
2 - Should I use accept_nested_for or should I use nested resources
3 - Is my model/database is okay or not the best?
4 - Are my foreign_key relationship well define?

提前致谢!!

2 个答案:

答案 0 :(得分:4)

我会做这样的事情:

class User
  has_many :mailboxes
  has_many :messages, :through => :tags
  has_many :tags
end

class Message
  has_many :users, :through => :tags
  has_many :mailboxes, :through => :tags
  has_many :tags
end

class Mailbox
  has_many :tags
  has_many :messages, :through => :tags
  has_many :users, :through => tags
end

class Tag
  belongs_to :user
  belongs_to :message
  belongs_to :mailbox
  # this class has "read?", "starred", etc.
end

这使得邮件可以显示在多个邮箱中,适用于多个用户,并且每个用户都可以拥有自己的“读取”,“已加星标”等。如果要确保用户,可以限制逻辑只有一个消息副本,即该消息不在同一用户的两个或多个邮箱中。

要改进架构,请阅读Rails指南,特别是关于 association 的内容,如下所示:

  • belongs_to的
  • HAS_ONE
  • 的has_many
  • has_many:通过
  • inverse_of

另请参阅Rails gem act-as-taggable-on

考虑消息架构的一种方法是“消息属于邮箱,邮箱有许多消息”(雅虎就是这样做的)。另一种思考邮件的方式是“邮件包含许多标签,邮箱只是按标签搜索”(Gmail就是这样做的)。

顺便说一句,Ruby mail gem非常棒。您可以使用它来创建消息,并查看它如何转换标题,如from,to,cc等。

你提出了很好的问题:

  • 1 - 我的新表单应该是inboxmessages还是消息?

    我的观点是,如果您的邮件模型类似于电子邮件,拥有邮箱(或标记)的模型,您将获得最大的收益。要创建新邮件,新表单通常位于./messages/new.html.erb

  • 2 - 我应该使用accept_nested_for还是应该使用嵌套资源?

嵌套资源很好;请参阅Rails指南:

http://guides.rubyonrails.org/routing.html#nested-resources

嵌套属性也很好;请参阅此处的API:

一个好的经验法则是只嵌套一个级别,因为之后它变得比它的价值更复杂。

  • 3 - 我的模特/数据库是否合适?

不是最好的。真实世界的消息通常具有发送者和接收者。但是你在inboxmessages表中建模发送者和接收者。最好使用has_many接收器对消息进行建模,并使用单独的模型进行用户与消息的交互,例如名为“marks”的表,其中包含“starred”,“isread”等字段。标记属于消息并属于一个用户。消息has_many标记,用户has_many标记。

  • 4 - 我的foreign_key关系是否定义良好?

总的来说,是的。请注意,电子邮件难以建模。一个好的经验法则是索引您的外键。另请查看Rails关联“inverse_of”并使用它;这将有助于速度和内存的使用。

答案 1 :(得分:1)

我希望我的课程设置如下。

class Inbox
  has_many :messages
  belongs_to :user
end

class User
  has_many :messages
  has_one :inbox
end

class Message
  belongs_to :user
  belongs_to :inbox
  has_many recipients, class_name: "User", foreign_key: "recipient_id"
end