我如何建模这些关系?

时间:2010-10-25 18:44:57

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

我有联系模式,包括姓名,地址,电话号码等。

我有一个应该有__联系的用户模型。

我有一个拥有多个联系人的客户模型。

我有一个生产者模型,它有很多联系人。

联系人只能是用户,用户和客户,用户和生产者,或这三者的任意组合。当联系人链接到多个模型以确保数据完整性时,我还需要确保链接相同的联系人记录。

我应该如何创建关联?

1 个答案:

答案 0 :(得分:1)

这似乎是polymorphic association的一个很好的应用程序:

class User < ActiveRecord::Base
  has_one :contact, :as => :contactable
end

class Customer < ActiveRecord::Base
  has_many :contacts, :as => :contactable
end

class Producer < ActiveRecord::Base
  has_many :contacts, :as => :contactable
end

class Contact < ActiveRecord::Base
  belongs_to :contactable, :polymorphic => true
end

修改

似乎我没有一直阅读规范:)要将同一个联系人与多个用户,客户等关联,您可以使用has_many :through

class User < ActiveRecord::Base
  has_one :user_contact, :dependent => :destroy
  has_one :contact, :through => :user_contact
end

class Customer < ActiveRecord::Base
  has_many :customer_contacts, :dependent => :destroy
  has_many :contacts, :through => :customer_contacts
end

class Producer < ActiveRecord::Base
  has_many :producer_contacts, :dependent => :destroy
  has_many :contacts, :through => :producer_contacts
end

class UserContact
  belongs_to :user
  belongs_to :contact
end

class CustomerContact
  belongs_to :customer
  belongs_to :contact
end

class ProducerContact
  belongs_to :producer
  belongs_to :contact
end

class Contact < ActiveRecord::Base
  has_many :user_contacts, :dependent => :destroy # might use 'has_one' here depending on your requirements
  has_many :users, :through => :user_contacts
  has_many :customer_contacts, :dependent => :destroy
  has_many :customers, :through => :customer_contacts
  has_many :producer_contacts, :dependent => :destroy
  has_many :producers, :through => :producer_contacts
end

这为三个关联中的每一个提供了一个连接表。通过向连接表添加行,每个联系人可以属于其他三个模型中的一个,一个或多个。