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ć.
[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.
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.