Проектирование приложения на Rails: наследование одной таблицы? - PullRequest
8 голосов
/ 11 октября 2011

Я занимаюсь этим уже несколько дней, и я знаю, что существует множество статей, в которых говорится о наследовании одной таблицы и полиморфных ассоциациях с Rails. Много полезного материала с 2009 года или раньше, и мне интересно, есть ли лучший подход к этой проблеме сейчас.

Ситуация

Приложение имеет несколько различных типов пользователей (например, Покупатель и Продавец), каждый из которых имеет свой профиль. Профиль для каждого типа пользователя действительно различен, поэтому в настоящее время я исключаю идею одной общей таблицы «профиля».

Мой текущий подход

, что совпадает с этим решением.

class User < ActiveRecord::Base
  # authentication stuff
end

class UserType1 < User
  has_one :user_type_1_profile
end

class UserType2 < User
  has_one :user_type_2_profile
end

...

class UserTypeN < User
  has_one :user_type_n_profile
end

Судя по моим исследованиям, это своего рода "смешанная модель".

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

У кого-нибудь есть другие предложения по дизайну?

1 Ответ

5 голосов
/ 11 октября 2011

Вам было бы лучше с полиморфной ассоциацией здесь с различными типами профилей.

class User < ActiveRecord::Base
  belongs_to :profile, :polymorphic => true
end

class ProfileTypeA < ActiveRecord::Base
  has_one :user, :as => :profile
end

class ProfileTypeB < ActiveRecord::Base
  has_one :user, :as => :profile
end

Для чего вам потребуется такая миграция / таблица:

change_table :users do |t|
  t.integer :profile_id
  t.string :profile_type
  # OR (same thing, the above is more explicit)
  t.references :profile, :polymorphic => true
end

Более подробная информация об этом в Руководстве: http://guides.rubyonrails.org/association_basics.html#polymorphic-associations

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