Ruby on Rails полиморфная ассоциация - PullRequest
5 голосов
/ 06 марта 2009

Вот что я пытаюсь достичь: у меня есть таблица Users, и каждый пользователь может быть любого из десятка типов: актер, танцор, режиссер, ... который определяется после регистрации. Каждый тип пользователя может иметь любое количество профилей. Например. у актеров может быть любое количество actor_profiles, у танцоров Cand может быть любое количество dancer_profiles, ...

Проблема в том, как связать профиль с пользователем. Очевидным решением было бы создать дополнительную таблицу для каждого типа профиля, чтобы я мог использовать полиморфную принадлежащую переменную «принадлежать» в «Пользователе», а затем простую принадлежащую «принадлежность» в каждом профиле, но это кажется неоптимальным. Возможно, лучшим способом было бы сообщить rails, что пользователь относится к типу actor, чтобы user.profiles работал естественным образом, без каких-либо помех. Поддерживает ли рельсы такое поведение, или есть что-то лучше, чем первый метод? Спасибо.

Ответы [ 3 ]

3 голосов
/ 10 марта 2009

В ответе pjb используется наследование одной таблицы. Чтобы это работало, вам нужно добавить столбец с именем type в ваши Users и в ваши таблицы Profiles *, чтобы Rails мог сохранить, какой это тип User (поскольку Actor, Dancer и т. Д. Являются просто подклассами User).

Это означает, что все они будут сохранены в таблицах пользователей / профилей, но при их создании ActiveRecord будет создавать их как правильный тип. С этим вы сможете звонить

User.find

но также делайте такие вещи, как

Actor.find, Actor.all, etc

и имеет область действия только для актеров

Google rails single table inheritance для более подробной информации и примеров.

  • Конечно, вам нужно объявить подклассы своего профиля так же, как вы объявили подклассы пользователя

Профиль класса

класс ActorProfile <Профиль конец </p>

класс DancerProfile <Профиль конец </p>

и т.д.

1 голос
/ 06 марта 2009

Определите отношения в подклассах:

class User < ActiveRecord::Base
end

class Actor < User
  has_many :profiles, :class_name => "ActorProfile"
end

class Dancer < User
  has_many :profiles, :class_name => "DancerProfile"
end
0 голосов
/ 22 мая 2009

Вам необходимо убедиться, что в вашей таблице User есть столбец с именем "type". Rails сохранит ТИП Класса (Пользователь, Актер и т. Д.) В этом поле базы данных.

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