2009-03-06 5 views
5

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

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

ответ

1

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

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 
3

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

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

User.find 

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

Actor.find, Actor.all, etc 

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

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

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

< класс профиля ActiveRecord :: Base belongs_to: пользователь конца

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

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

и т.д.

0

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