# Associazione molti a molti - salvataggio tabella intermedia

**URL:** <https://www.ruby-forum.com/t/associazione-molti-a-molti-salvataggio-tabella-intermedia/169585>\
**Category:** IT\
**Created:** [June 5, 2009, 5:19pm UTC](https://www.ruby-forum.com/t/associazione-molti-a-molti-salvataggio-tabella-intermedia/169585 "2009-06-05T17:19:08Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![triplem](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/b19c9b/32.png) [@triplem](https://www.ruby-forum.com/u/triplem)\
**Post date:** [June 5, 2009, 5:19pm UTC](https://www.ruby-forum.com/t/associazione-molti-a-molti-salvataggio-tabella-intermedia/169585/1 "2009-06-05T17:19:08Z")

</div>

Ciao a tutti,  
sto realizzando il mio primo progetto con Rails e 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) con la tabella ‘discteaches’, sto usando  
l’associazione has\_many-through perche’  
has\_and\_belongs\_to many mi dava ancora piÃ¹ problemi.  
Sto gestendo l’INSERIMENTO DI UN NUOVO INSEGNANTE (nella vista scelgo la  
materia con un menu a discesa), non so bene come salvare nella tabella  
intermedia ‘discteaches’ l’id dell’insegnante e quello della disciplina  
… quando voglio salvare Rails mi da’ “undefined variable or method  
teacher…”  
e non salva niente.

Qualcuno ha la pazienza di darci un’occhiata? 😉

MODEL

in teacher.rb ho scritto:  
has\_many :disciplines, :through =\> :discteaches  
in discipline.rb ho scritto:  
has\_many :teachers, :through =\> :discteaches  
in discteach.rb ho scritto:  
belongs\_to teacher  
belongs\_to discipline

CONTROLLER (teachers\_controller)

def create  
@teacher = Teacher.new(params[:teacher])  
@discteach = Discteach.new  
@discteach.discipline\_id = params[:discipline.id]  
@discteach.teacher\_id = @teacher.id  
@teacher.save  
@discteach.save  
if @teacher.save && @discteach.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

VISTA (teachers\new.html.erb)

\<%= error\_messages\_for ‘teacher’ %\>

# Inserimento nuovi insegnanti:
\<% form\_for @teacher do |f| %\>

cognome: \<%= f.text\_field :cognome %\>

nome: \<%= f.text\_field :nome %\>

materia: \<% for discipline in @discipline %\> " **\<%= discipline.descrizione %\>** \<% end %\>

\<%= submit\_tag "Salva insegnante" %\>

\<% end %\>

---

<div class="post-metadata">

**Author:** ![triplem](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/b19c9b/32.png) [@triplem](https://www.ruby-forum.com/u/triplem)\
**Post date:** [June 6, 2009, 11:36am UTC](https://www.ruby-forum.com/t/associazione-molti-a-molti-salvataggio-tabella-intermedia/169585/2 "2009-06-06T11:36:23Z")

</div>

Marco M. wrote:

> in teacher.rb ho scritto:  
> has\_many :disciplines, :through =\> :discteaches  
> in discipline.rb ho scritto:  
> has\_many :teachers, :through =\> :discteaches

Allora, in entrambi manca  
has\_many :discteaches

> def create  
> @teacher = Teacher.new(params[:teacher])  
> @discteach = Discteach.new  
> @discteach.discipline\_id = params[:discipline.id]  
> ^^^^^^^^^^^^^^^^  
> params[:discipline.id] Ã¨ nil, se nella vista usi   
> qui dovrai usare params[:materia]

> ```
> @discteach.teacher_id = @teacher.id
> 
> ```

qui @teacher.id Ã¨ nil, essendo @teacher un nuovo record non ancora  
salvato id Ã¨ nil. Prima devi salvare @teacher, poi assegnare  
@discteach.teacher\_id

Un appunto stilistico: secondo me Ã¨ orribile mischiare italiano e  
inglese nel codice: leggere robe tipo teacher.cognome o  
discipline.descrizione fa venire l’orticaria e manca di consistenza, se  
il tuo problema Ã¨ avere i nomi dei campi in italiano nelle viste ti  
consiglio di usare la localizzazione di rails che funziona benissimo  
anche per queste cose.

Ultima nota: ci sono un paio di screencast sulle relazioni has\_many e  
has\_many through su [railscasts.com](http://railscasts.com), ti consiglio di guardarli per vedere  
come migliorare il codice del controller e delle viste.

---

<div class="post-metadata">

**Author:** ![triplem](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/b19c9b/32.png) [@triplem](https://www.ruby-forum.com/u/triplem)\
**Post date:** [June 6, 2009, 4:29pm UTC](https://www.ruby-forum.com/t/associazione-molti-a-molti-salvataggio-tabella-intermedia/169585/3 "2009-06-06T16:29:48Z")

</div>

Msan M. wrote:

> Ti riferisci a gettext per la localizzazione?

No, alla internazionalizzazione di rails con i file .YML in  
config/locales e il metodo I18n.translate… qui trovi un esempio per la  
parte relativa ad activerecord:  
[http://iain.nl/2008/09/translating-activerecord](http://iain.nl/2008/09/translating-activerecord)

---

<div class="post-metadata">

**Author:** ![triplem](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/b19c9b/32.png) [@triplem](https://www.ruby-forum.com/u/triplem)\
**Post date:** [June 6, 2009, 12:05pm UTC](https://www.ruby-forum.com/t/associazione-molti-a-molti-salvataggio-tabella-intermedia/169585/4 "2009-06-06T12:05:29Z")

</div>

2009/6/6 Andrea L. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> Un appunto stilistico: secondo me è orribile mischiare italiano e  
> inglese nel codice: leggere robe tipo teacher.cognome o  
> discipline.descrizione fa venire l’orticaria e manca di consistenza, se  
> il tuo problema è avere i nomi dei campi in italiano nelle viste ti  
> consiglio di usare la localizzazione di rails che funziona benissimo  
> anche per queste cose.

Ti riferisci a gettext per la localizzazione?

---

<div class="post-metadata">

**Author:** ![triplem](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/b19c9b/32.png) [@triplem](https://www.ruby-forum.com/u/triplem)\
**Post date:** [June 7, 2009, 1:12pm UTC](https://www.ruby-forum.com/t/associazione-molti-a-molti-salvataggio-tabella-intermedia/169585/5 "2009-06-07T13:12:58Z")

</div>

2009/6/6 Andrea L. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> Msan M. wrote:
> 
> > Ti riferisci a gettext per la localizzazione?
> 
> No, alla internazionalizzazione di rails con i file .YML in  
> config/locales e il metodo I18n.translate… qui trovi un esempio per la  
> parte relativa ad activerecord:  
> [http://iain.nl/2008/09/translating-activerecord](http://iain.nl/2008/09/translating-activerecord)

Avevo sottovalutato la localizzazione e l’internazionalizzazione nelle  
mie apps.  
Ho visto che esiste un plugin, globalize,  
[GitHub - joshmh/globalize2: The second incarnation of Globalize for Rails](http://github.com/joshmh/globalize2/tree/master).

---

<div class="post-metadata">

**Author:** ![triplem](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/b19c9b/32.png) [@triplem](https://www.ruby-forum.com/u/triplem)\
**Post date:** [June 7, 2009, 2:55pm UTC](https://www.ruby-forum.com/t/associazione-molti-a-molti-salvataggio-tabella-intermedia/169585/6 "2009-06-07T14:55:38Z")

</div>

Andrea L. wrote:

> Marco M. wrote:

Grazie mille Andrea!!!  
sto imparando molto in qs giorni… e l’applicativo comincia  
a prendere forma!  
Marco
