2009-03-06 20 views
5

Oto, co staram się osiągnąć: Mam tabelę Użytkownicy, a każdy użytkownik może być jednym z kilkunastu typów: aktor, tancerz, reżyser, ... który jest ustalany po zarejestrowaniu. Każdy typ użytkownika może mieć dowolną liczbę profili. Na przykład. aktorzy mogą mieć dowolną liczbę actor_profiles, tancerze mają dowolną liczbę profili dancer_profiles, ...Stowarzyszenie polimorficzne Ruby on Rails

Problem polega na tym, jak połączyć profil z użytkownikiem. Oczywistym rozwiązaniem byłoby utworzenie dodatkowej tabeli dla każdego typu profilu, aby móc użyć polimorficznego elementu belongs_to w User, a następnie prostego belongs_to w każdym profilu, ale wydaje się to mniej optymalne. Prawdopodobnie lepszym rozwiązaniem byłoby wskazanie szynom, że użytkownik jest aktorem typu, aby profile user.profiles działały naturalnie, bez zbędnych elementów. Czy szyny wspierają takie zachowanie, czy jest coś lepszego niż poprzednia metoda? Dzięki.

Odpowiedz

1

określenia relacji w podklasach: odpowiedź

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 używa pojedynczej tabeli dziedziczenia. Aby to działało, musisz dodać kolumnę o nazwie type do twoich użytkowników i do tabel Profiles *, aby Railsy mogły zapisywać, jakiego typu użytkownika to jest (ponieważ Aktor, Dancer itd. To tylko podklasy Użytkownika).

Oznacza to, że wszystkie zostaną zapisane w tabelach użytkowników/profili, ale po ich utworzeniu ActiveRecord utworzy je jako poprawny typ. Dzięki temu będziesz mógł zadzwonić

User.find 

ale również robić takie rzeczy jak

Actor.find, Actor.all, etc 

i go scoped tylko Aktorzy

Google rails single table inheritance więcej szczegółów i przykładów.

  • Oczywiście trzeba by zadeklarować swój profil podklas ten sam sposób zadeklarowany Twój Użytkownik podklas

klasy profilu < ActiveRecord :: Base belongs_to: użytkownik koniec

klasa ActorProfile < Profil koniec

klasa DancerProfile < Profil koniec

itp

0

Musisz upewnić się, że tabela Użytkownik ma kolumnę o nazwie „typem”. Railsy zapisze TYPE klasy (User, Actor, itp.) W tym polu bazy danych.