PDA

Visualizza la versione completa : has_and_belongs_to many


marco_m
04-06-2009, 12:42
Ciao,
sto gestendo una relazione molti a molti tra la tabella 'disciplines'
e la tabella 'teachers' (una materia e' insegnata da molti professori e un
professore puo' insegnare più materie).
In teacher.rb ho scritto:
has_and_belongs_to_many :disciplines
in discipline.rb ho scritto:
has_and_belongs_to_many :teachers
Ho letto che gli automatismi di ActiveRecord portano a gestire una tabella
di join di nome 'disciplines_teachers' che contiene solo le chiavi esterne
teacher_id e discipline_id e che non è necessario crearne il model.

Domanda: quando inserisco un nuovo insegnante come faccio a salvare i dati anche in disciplines_teachers?
Se Rails lo fa da solo (?) dov'e' la tabella? (uso POSTGRESQL e la tabella
disciplines_teachers non e' stata creata, non c'e'...)

Grazie :dhò:

toraz
04-06-2009, 14:53
Originariamente inviato da marco_m
quando inserisco un nuovo insegnante come faccio a salvare i dati anche in disciplines_teachers?
Se Rails lo fa da solo (?)

Si, fa tutto da solo



dov'e' la tabella? (uso POSTGRESQL e la tabella
disciplines_teachers non e' stata creata, non c'e'...)

Devi crearla tu

marco_m
04-06-2009, 16:14
Grazie mille Toraz!

Ancora però non ci sono...
Siccome non sono pratico di Postgresql uso PgAdminIII: ho creato
la tabella 'disciplines_teachers' coi 2 campi chiave esterna e non ho
creato alcun campo chiave primaria ma ho selezionato OID.

Ho inserito un nuovo insegnante e ancora niente...

Quando inserisco un nuovo insegnante con la view digito il nome ed il cognome
(i 2 campi di 'teachers') e seleziono da un menu a tendina la materia,
dato che quindi non va in un campo di teachers... come fa Rails a sapere
come riempire i campi di disciplines_teachers?
Devo io creare un nuovo oggetto di discipline_teachers e poi salvarlo?

toraz
04-06-2009, 17:25
Originariamente inviato da marco_m
Ancora però non ci sono...
Siccome non sono pratico di Postgresql uso PgAdminIII: ho creato
la tabella 'disciplines_teachers' coi 2 campi chiave esterna e non ho
creato alcun campo chiave primaria ma ho selezionato OID.

La cosa più saggia sarebbe creare la tabella tramite una migration


...
def self.up
create_table :disciplines_teachers, :id => false do |t|
t.references :discipline
t.references :teacher
end
end
...

Così Rails se la sbriga da solo quale che sia il database che stai usando.



Ho inserito un nuovo insegnante e ancora niente...

Cioè? Niente cosa?



Quando inserisco un nuovo insegnante con la view digito il nome ed il cognome
(i 2 campi di 'teachers') e seleziono da un menu a tendina la materia,
dato che quindi non va in un campo di teachers... come fa Rails a sapere
come riempire i campi di disciplines_teachers?

Boh? Com'è fatta la view? E il controller?

marco_m
04-06-2009, 18:07
nel controller di teacher ho le seguenti righe (salvo nell'oggetto @teacher tutto quello
che c'è in params...)

def create
@teacher = Teacher.new(params[:teacher])
@teacher.save
if @teacher.save
flash[:notice] = 'Form memorizzato!'
redirect_to teachers_path
else
render :action => 'new'
end
end

def new
if session[:user_id]
@current_user = User.find_by_id(session[:user_id])
end
@discipline = Discipline.find(:all)
@teacher = Teacher.new
end

nella vista new di teacher ho:

<%= error_messages_for 'teacher' %>
<h1>Inserimento nuovi insegnanti:</h1>
<% form_for @teacher do |f| %>



cognome: <%= f.text_field :cognome %>
</p>



nome: <%= f.text_field :nome %>
</p>



materia:
<select name="materia">
<% for discipline in @discipline %>
<option value= "<%=h discipline.id %>" <%=h discipline.descrizione %>
</option>
<% end %>
</select>
</p>



<%= submit_tag "Salva insegnante" %>
</p>
<% end %>

devo salvare il dato selezionato nella option (che non è di teacher)...

Grazie

toraz
06-06-2009, 17:32
Originariamente inviato da marco_m
<select name="materia">
<% for discipline in @discipline %>
<option value= "<%=h discipline.id %>" <%=h discipline.descrizione %></option>
<% end %>
</select>

Così non funziona di sicuro. L'hash params che ne viene fuori è fatto tipo


{ :none => "foo", :cognome => "bar", :materia => "1" }

tu ce l'hai un metodo "materia" nel modello Teacher che sappia che farsene di un identificatore del genere? Se si sei a posto, se no devi definirlo. Oppure potrebbe anche esserci qualche altra soluzione migliore al problema, ma francamente non mi viene in mente niente.

marco_m
06-06-2009, 19:46
Grazie tante Toraz...

Mi sembrava normale questo params...
comunque (dopo molte ore) ho capito che il select non era una buona soluzione perche' ti permette di selezionare una sola materia... Ho pensato allora ai check_box, sono tornato alle relazioni has_and_belongs_to, ho trovato su railscast un video che faceva al caso mio
e adesso... FUNZIONA!

Grazie ancora, buone cose!

toraz
07-06-2009, 01:11
Originariamente inviato da marco_m
railscast un video che faceva al caso mio

Posti il link?

marco_m
07-06-2009, 10:11
... certo, eccolo qua:

http://railscasts.com/episodes/17

weppos
07-06-2009, 11:43
ho capito che il select non era una buona soluzione perche' ti permette di selezionare una sola materia...

I select possono anche essere configurati per accettare più selezioni.

Loading