我有以下场景,我想为Rails应用程序建模最佳方式。
我有一个属于公司的联系模式。联系人可以创建查询,以便联系人可以进行多次查询。查询可以包含许多可以来自和来自多个联系人的消息。消息可以属于查询,公司或联系人。
这让我对如何最好地模拟这一点感到困惑。有什么想法吗?
致以最诚挚的问候,
Richard Moss
答案 0 :(得分:2)
在这种情况下,Message
似乎应该是polymorphic,因为它们可以属于许多不同的模型。由于联系人可以向其他联系人发送消息,因此Contact
将与消息建立两个关联,一个用于sent_messages
,另一个用于received_messages
。 Message
将通过contact_id
绑定到发件人。
class Contact < ActiveRecord::Base
belongs_to :company
has_many :enquiries
has_many :sent_messages, :class_name => "Message"
has_many :received_messages, :as => :messageable, :class_name => "Message"
end
class Company < ActiveRecord::Base
has_many :contacts
has_many :messages, :as => :messageable
end
class Enquiry < ActiveRecord::Base
belongs_to :contact
has_many :messages, :as => :messageable
end
class Message < ActiveRecord::Base
belongs_to :contact
belongs_to :messageable, :polymorphic => true
end
这应该很好地模拟你的关系要求。如果您想更好地理解它,Railscast on Polymorphic Associations也可能有一些见解。
答案 1 :(得分:0)
听起来混淆的是消息,而不是其他部分。
对于每个查询,公司和联系人,我都会使用belongs_to(我假设您有一些与查询无关的消息)。然后我会做一个自定义验证,以确保至少指定了其中一个 - 但否则不会为其中任何一个执行validates_presence_of。
辅助方法可以减轻查找给定消息所关联的痛苦,因此您不必检查这三个关系中的每个关系,以寻找不是零的关系。