Relacje wiele do jeden - mysql

Cześć,

mam 2 modele users oraz job. W users mam belongs_to :job, a w job mam has_many :users W users mam pole job_name a w job mam pole name

Nie rozumiem, dlaczego moge dodać dowolną wartość w polu job_name skoro istnieje relacja ? W oracle coś takiego jest niemożliwe.

Chyba, że prócz tych 2 linijek dodanych w modelu trzeba coś dodać ?

Druga sprawa, chciałbym w momencie rejestracji dodać select boxa z wszystkimi polami z tabeli job lub w przypadku gdy nie ma możliwość wpisania swojego swojego zawodu. Niestety nie mam pomysłu jak to zrobić.

No to po kolej:

Jobs ma wiele userów, user a joba.

user ma swoje pola, plus pole job_id + w modelu belongs_to :job
job ma has_many :users.

migracje odpalasz.

No i teraz masz odstęp do:

Jobs.all -> wszystkie joby
User.find(1).job masz joba usera
Job.find(1).users -> masz wszystkich userów którzy maja taki job.

Do teog dajesz formtastic_form. By się ręcznie nie rzeźbić i masz te checkboxy z automatu.

No chyba wszytsko, i nic z głowy nie przegapiłem.

[quote=chinchin]mam 2 modele users oraz job. W users mam belongs_to :job, a w job mam has_many :users W users mam pole job_name a w job mam pole name

Nie rozumiem, dlaczego moge dodać dowolną wartość w polu job_name skoro istnieje relacja ? W oracle coś takiego jest niemożliwe.[/quote]
Coś ściemniasz. Na razie nie ma żadnego powiązania pomiędzy kolumną users.job_name a jobs.name. No chyba, że o czymś nie napisałeś. W jaki magiczny sposób Oracle miałby zabronić podania dowolnego users.job_name?

W momencie uzupelniania tabeli users w relacyjnej bazie danych(a istnieje relacja pomiedzy users.job_name a job.name), w przypadku braku odpowiedniego rekordu w tabeli job nie dodasz żadnego rekordu do tabeli users. O czym Ty piszesz ?

Gdzie niby istnieje ta relacja? ActiveRecord szuka pola {nazwa relacji}_id, czyli w Twoim przypadku job_id. Nie żadne job_name. Takiś spec od relacyjnych baz a chcesz nazwę Joba wstawiać do tabeli users, zamiast powiązać rekordy i wyciągać nazwę z relacji (user.job.name)? Ładnie…

Za dużo założeń, do tego nieopisanych i niepotrzebnych.

To co sugerujesz to spięcie jobs i users za pomocą foreign key na users.job_name i jobs.name. To słaby pomysł z punktu widzenia DBA i raczej pokazuje brak doświadczenia. Poczytaj o wyższości surrogate keys ponad natural keys.

W świecie Rails korzystamy tylko z surrogate keys czyli pól id. Pola users.id i jobs.id są tworzone domyślnie przez migracje. Jeśli chcesz połączyć takie tabele to używasz has_one i dodajesz kolumnę job_id w tabeli users. Nie ma wymogu ustawiania foreign keys na poziomie baz danych. Tego typu zależności opisuje się tylko przez validates_presence_of i poboczne oraz testy jednostkowe.

W modelu User zapisujesz tylko job_id i używasz user.job.name. Jeśli bardzo potrzebujesz skrótu to:

class User <ActiveRecord::Base delegate :name, :to => :job, :prefix => true end
I od tego momentu user.job_name powinno działać jak należy. http://apidock.com/rails/Module/delegate

Popracuj trochę nad sposobem przekazywania swoich problemów i nie chwal się za bardzo tym Oracle bo to wstyd w dzisiejszych czasach.

[quote=gotar]Jobs.all -> wszystkie joby
User.find(1).job masz joba usera
Job.find(1).users -> masz wszystkich userów którzy maja taki job.[/quote]
W tej chwili pokazuje mi ID JOBA, jak zrobić żeby wszędzie pokazywało pole name z joba?

W szablonie index.html.erb jest user.job_id, ja to rozwiązałem w taki sposób <%= Job.find(user.job_id).name %>, ale to jest niezbyt eleganckie i są jeszcze pozostałe szablony. Można to jakoś inaczej zamienić id na nazwę? Myslałem, żeby to jakoś zrobić w controllerze, ale nie mam pomysłu.

[code=ruby]# kontroler
@user = User.find(1)

widok

@user.job.name[/code]
Nic dodać, nic ująć.

No tak, tak też miałem, ale muszę edytowac wszystkie pliki w views. Rozumiem, że inaczej nie można?

Nie rozumiem co chcesz osiągnąć - czy chodzi Ci o to, że w widokach masz user.job_name, czy coś innego?
Jeśli tak to zaimplementuj rozwiązanie Bragiego i po sprawie.