我正在尝试创建一个个人收件箱邮件系统,但我想起了几个问题。首先让我解释一下我的系统。
这是我的桌子型号
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?
提前致谢!!
答案 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 的内容,如下所示:
另请参阅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:
一个好的经验法则是只嵌套一个级别,因为之后它变得比它的价值更复杂。
不是最好的。真实世界的消息通常具有发送者和接收者。但是你在inboxmessages表中建模发送者和接收者。最好使用has_many接收器对消息进行建模,并使用单独的模型进行用户与消息的交互,例如名为“marks”的表,其中包含“starred”,“isread”等字段。标记属于消息并属于一个用户。消息has_many标记,用户has_many标记。
总的来说,是的。请注意,电子邮件难以建模。一个好的经验法则是索引您的外键。另请查看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