模拟这些Rails关系的最佳方法

时间:2009-11-07 13:51:15

标签: ruby-on-rails ruby model modeling

我有以下场景,我想为Rails应用程序建模最佳方式。

我有一个属于公司的联系模式。联系人可以创建查询,以便联系人可以进行多次查询。查询可以包含许多可以来自和来自多个联系人的消息。消息可以属于查询,公司或联系人。

这让我对如何最好地模拟这一点感到困惑。有什么想法吗?

致以最诚挚的问候,

Richard Moss

2 个答案:

答案 0 :(得分:2)

在这种情况下,Message似乎应该是polymorphic,因为它们可以属于许多不同的模型。由于联系人可以向其他联系人发送消息,因此Contact将与消息建立两个关联,一个用于sent_messages,另一个用于received_messagesMessage将通过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。

辅助方法可以减轻查找给定消息所关联的痛苦,因此您不必检查这三个关系中的每个关系,以寻找不是零的关系。