3

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

这是我的桌子模型

  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?

提前致谢!!

4

2 回答 2

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 指南,尤其是关于以下关联的内容:

  • 属于
  • has_one
  • 有很多
  • has_many:通过
  • inverse_of

另请查看 Rails gem充当可标记

考虑消息模式的一种方式是“一条消息属于一个邮箱,而一个邮箱有很多消息”(这就是 Yahoo 的做法)。另一种看待邮件的方式是“邮件有很多标签,而邮箱只是按标签搜索”(这就是 Gmail 的做法)。

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

你问了很好的问题:

  • 1 - 我的新表单应该在收件箱消息还是消息中?

    我的观点是,如果你有一个类似于电子邮件的消息模型,一个邮箱(或标签)模型,你将获得最大的好处。要创建新消息,新表单通常位于 ./messages/new.html.erb

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

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

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

嵌套属性也很好;在此处查看 API:

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

  • 3 - 我的模型/数据库是好的还是不是最好的?

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

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

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

于 2012-08-27T18:34:07.900 回答
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
于 2012-08-27T18:46:30.610 回答