Две таблицы с одинаковым ключом в Rails вместо отношения has_one - PullRequest
3 голосов
/ 31 октября 2011

Я работаю над веб-приложением Rail. У меня есть две модели, Пользователь, который содержит очень основную информацию: идентификатор, имя пользователя и пароль, и Профиль, который включает в себя профиль для каждого пользователя. (Основная причина в том, чтобы иметь облегченную модель пользователя, которая будет вызываться регулярно, и полноценный профиль, который будет вызываться нерегулярно). У каждой из этих моделей много детей.

Сейчас у меня есть Профиль с собственным первичным ключом, а затем внешний ключ user_id для сопоставления с Пользователем.

Однако мне интересно, должна ли у меня быть модель профиля с тем же ключом, что и у модели пользователя (т.е. Profile.id == User.id, если записи ссылаются на одного и того же пользователя). Это удобно, потому что когда у меня есть объект, принадлежащий пользователю, я хочу, чтобы он принадлежал профилю, и наоборот. Например, я могу указать отношение User has_many и Spec has_many к ChildModel. Поскольку они используют один и тот же ключ, мне не нужно объединять ChildModel со Spec, а затем Profile to User, чтобы найти пользователя, связанного с дочерним объектом.

Недостаток в будущем, если по какой-то причине у меня будет несоответствие между первичным ключом User и Spec, то у меня большие проблемы.

Что бы вы посоветовали в этой ситуации?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 31 октября 2011

Похоже, вы должны использовать взаимно-однозначное отношение между Profile и User.Вы можете создать это, используя объявления has_one и belongs_to.

class User < ActiveRecord::Base
  has_one :profile
end

class Profile < ActiveRecord::Base
  belongs_to :user
end

Как указано в Agile Web Development с Rails Четвертое издание:

Здесь показано важное правило: модель для таблицы, которая содержит внешний ключ всегда , имеет объявление belongs_to.

0 голосов
/ 31 октября 2011

Я бы предложил вам использовать отображение отношений has_one, как показано ниже

пользовательский класс

class User
  has_one :profile, :dependent => :destroy # you probably want this on destroy
end

Миграция

create_table :users do |t|
   t.string :username
   t.string :password
end
create_table :profiles do |t|
   t. integer :user_id 
    ... other attributes
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...