Модель Ruby on Rails / Ассоциации баз данных - PullRequest
0 голосов
/ 03 июня 2011

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

У фермера есть пользователь и много образований.

У врача есть пользователь и много образований.

Как настроить базу данных для модели образования?

Должен ли он иметь идентификатор_производителя И идентификатор_правителя?

Но образование не может принадлежать фермеру И и врачу одновременно. Это один или другой.

Таким образом, в моей записи в базе данных об образовании будет либо указано значение farmer_id ИЛИ doctor_id, но не оба.

Есть ли способ гарантировать, что только один из идентификаторов может быть заполнен одновременно?

Или есть лучший способ связать эти модели?

Ваша помощь будет принята с благодарностью!

Да, и не беспокойтесь о названиях моделей (фермер, доктор и т. Д.). Это просто пример.

Ответы [ 2 ]

2 голосов
/ 03 июня 2011

Я вижу два возможных решения для этого сценария.

Первый - использовать полиморфные ассоциации в образовании. Это может выглядеть так:

class Farmer < ActiveRecord::Base
  belongs_to :user
  has_many :educations, :as => :profession
end

class Doctor < ActiveRecord::Base
  belongs_to :user
  has_many :educations, :as => :profession
end

class Education < ActiveRecord::Base
  belongs_to :profession, :polymorphic => true
end

Таким образом, вместо образования, имеющего doctor_id или farmer_id, у него есть один профессия_ид и один профессия_тип.

Вторым решением было бы использование наследования одной таблицы. И в вашем сценарии это может быть достигнуто, если Доктор будет Пользователем, а не будет принадлежать ему. И, конечно, то же самое для фермера. Это может выглядеть так:

class User < ActiveRecord::Base
  has_many :educations
end

class Farmer < User
end

class Doctor < User
end

class Education < ActiveRecord::Base
  belongs_to :user
end

И в этом сценарии вы добавили бы столбец типа в модель User, чтобы сохранить тип этого класса, а затем иметь только user_id в модели Education

2 голосов
/ 03 июня 2011

Я считаю целесообразным, чтобы отношения были такими, основанными на ролях.

Class User
  has_one :role
  has_many :educations
end

Class Role
  #What ever roles you have.
  #Farmer or Doctor
  belongs_to :user
end


class Education
  belongs_to :user
end

Таким образом, вы сохраните user_id в объекте образования, который решит вашу проблему.

...