Как мне смоделировать эти отношения? - PullRequest
1 голос
/ 25 октября 2010

У меня есть модель контакта, включая имя, адрес, номер телефона и т. Д.

У меня есть модель пользователя, которая должна иметь один контакт.

У меня есть модель клиента, у которой есть контакты.

У меня есть модель производителя, которая имеет много контактов.

Контактом может быть только пользователь, пользователь и клиент, пользователь и производитель или любая комбинация этих трех.Мне также нужно убедиться, что одна и та же запись контакта связана, когда контакт связан с несколькими моделями для обеспечения целостности данных.

как мне создать ассоциации?

1 Ответ

1 голос
/ 25 октября 2010

Это выглядит как хорошее приложение для полиморфной ассоциации :

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

, который дает вам одну таблицу соединений для каждой из трех ассоциаций.Каждый Контакт может принадлежать ни одной, ни одной, ни многим из трех других моделей, добавляя строки в таблицы объединения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...