W przedmiotach (Subject) będę przechowywał nazwy przedmiotów: polski, matma, biologia itd.
W klasach (Class) będę przechowywał opisy klas: np. matematyczno-informatyczno-fizyczna, biologiczno-chemiczna itd.
W klasach (Class) chciałbym mieć informację o przedmiotach punktowanych podczas rekrutacji (dla każdej klasy inne przedmioty), zatem chciałbym stworzyć relację:
Subject has_many Class
Class has_many Subject
czyli relacja N:N
Chciałbym żeby w widoku dla klasy (Class) można było wybierać jeden lub dwa przedmioty punktowane z listy wyboru.
Mój pomysł jest taki żeby to zrobić przez :through
Ale ponieważ można wybrać max. 2 przedmioty punktowane to może dało by się to zrobić prościej ?
Np.
rails g scaffold class nazwa_klasy:string opis:text subject1_id:integer subject2_id:integer
Ale po co tak kombinować? Przecież Convention over configuration Teoretycznie habtm da radę, ale w zupełności zgadzam się z sharnikiem, że has_many :through jest najczęściej dużo lepszym wyborem. W tym przypadku również - mając trzeci model, dysponujesz walidacjami, callbackami czy dodatkowymi atrybutami dla każdej pary obiektów Subject i Class. W ten sposób możesz na przykład bardzo łatwo sprawdzać, czy dana klasa ma już dwa przypisane przedmioty (poczytaj przy okazji o counter cache).
Btw. nie wiem, czy moje wątpliwości są zasadne, musiałby to ktoś bardziej ogarnięty wyjaśnić, ale wydaje mi się, że nazywanie klasy Class nie jest najszczęśliwsze (vide http://apidock.com/rails/Class)
W kontrolerze CanididateProfilesController mam coś takiego
def index
@candidate_profiles = CandidateProfile.where("candidate_id = ?", params[:candidate_id])
end
I w konsoli dostaje coś takiego:
SELECT “candidate_profiles”.* FROM “candidate_profiles” WHERE (candidate_id = NULL)
Co robię źle? Da się to zrobić bez WHERE, tak żeby nie używać SQL’a ?
Nie wiem jaki masz routing. Skoro użyłeś scaffolda zakładam, że defaultowy resources.
Jeżeli tak, powinno Ci to stworzyć ściężkę do akcji #show dla CanididateProfilesController podobną do poniższej:
<%= form_for(@candidate_profile, :url => candidate_candidate_profiles_path(@candidate_profile.candidate_id)) do |f| %>
<% if @candidate_profile.errors.any? %>
Nie ma jakiegoś prostrzego sposobu na na relację has_many.
Może jest jakiś generator w stylu
rails g scaffold candidate has_many candidate_profiles …
Swoją drogą, to candidate_candidate_profile_path wygląda trochę kretyńsko. Na Twoim miejscu przemianowałbym np. kontroler CandidateProfilesController na Candidate::ProfilesController - tak jak opisują to tutaj.
Wtedy url-helpery wyglądałyby mniej więcej tak: