# Habtm

**URL:** <https://www.ruby-forum.com/t/habtm/108626>\
**Category:** IT\
**Created:** [July 5, 2007, 2:02pm UTC](https://www.ruby-forum.com/t/habtm/108626 "2007-07-05T14:02:10Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![Lorenzo\_P](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/l/858c86/32.png) [@Lorenzo\_P](https://www.ruby-forum.com/u/Lorenzo_P)\
**Post date:** [July 5, 2007, 2:02pm UTC](https://www.ruby-forum.com/t/habtm/108626/1 "2007-07-05T14:02:10Z")

</div>

Salve a tutti!  
Sono Lorenzo da Roma!  
Non ho ancora familiarizzato con rubyonrails e la sua immediatezza mi  
affascina.  
Sto sviluppando in rubyonrails un’applicazione di fatturazione e mi sono  
imbattuto nella relazione HABTM (has\_and\_belongs\_to\_many).

Vi elenco le tabelle in questione:

* * *

Tab. Products ( id, codice, prezzo)  
Tab. Receipts (id,prezzo\_tot, data\_elaborazione)  
Tab. Products\_Receipts (receipt\_id [INTEGER], product\_id [INTEGER])

* * *

Come da documentazione ho creato le relazioni nei modelli:

model Receipt ----\> has\_and\_belongs\_to\_many :products  
model Product ----\> has\_and\_belongs\_to\_many :receipts

E fin quì tutto ok!

Ho creato dunque nel partial (app/view/receipts/\_form.rhtml)  
un lista di prodotti con checkboxes nel modo seguente:

* * *

# file : app/view/receipts/\_form.rhtml

[…]

\<% Product.find(:all).each do |g| %\> - \<%= g.codice %\> checked="checked" \<% end %\> /\> 
\<% end %\>
[...] ---------------------------------------------------------------------------------------------------------------- Riesco dunque a visualizzare l'elenco dei prodotti nel form della fattura (receipt) ma, quando salvo o edito una fattura, non viene scritta nessuna riga sulla tabella "Products\_Receipts".

Purtroppo non sono ancora entrato nella logica “ad oggetti” quindi non  
mi  
muovo così agilmente con rails…  
…dunque … AIUTO !!!

Grazie a tutti !  
A presto!  
Lorenzo

---

<div class="post-metadata">

**Author:** ![Lorenzo\_P](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/l/858c86/32.png) [@Lorenzo\_P](https://www.ruby-forum.com/u/Lorenzo_P)\
**Post date:** [July 5, 2007, 2:39pm UTC](https://www.ruby-forum.com/t/habtm/108626/2 "2007-07-05T14:39:14Z")

</div>

Lorenzo P. ha scritto:

> Riesco dunque a visualizzare l’elenco dei prodotti nel form della fattura  
> (receipt) ma, quando salvo o edito una fattura,  
> non viene scritta nessuna riga sulla tabella “Products\_Receipts”.

Come effettui il salvataggio?

---

<div class="post-metadata">

**Author:** ![Lorenzo\_P](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/l/858c86/32.png) [@Lorenzo\_P](https://www.ruby-forum.com/u/Lorenzo_P)\
**Post date:** [July 5, 2007, 2:42pm UTC](https://www.ruby-forum.com/t/habtm/108626/3 "2007-07-05T14:42:14Z")

</div>

In realtà non ho impostato nessuna azione di salvataggio sul controller  
Receipt ed proprio qui, credo il problema.  
Ecco il codice dell’azione create:

def new  
@receipt = Receipt.new  
end

def create  
@receipt = Receipt.new(params[:receipt])  
if @receipt.save  
flash[:notice] = ‘Receipt was successfully created.’  
redirect\_to :action =\> ‘list’  
else  
render :action =\> ‘new’  
end  
end

Il 05/07/07, Luca G. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) ha scritto:

---

<div class="post-metadata">

**Author:** ![Lorenzo\_P](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/l/858c86/32.png) [@Lorenzo\_P](https://www.ruby-forum.com/u/Lorenzo_P)\
**Post date:** [July 5, 2007, 2:49pm UTC](https://www.ruby-forum.com/t/habtm/108626/4 "2007-07-05T14:49:15Z")

</div>

A… Dimenticavo… Grazie per l’interessamento!!!

Il 05/07/07, Lorenzo P. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) ha scritto:

---

<div class="post-metadata">

**Author:** ![Lorenzo\_P](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/l/858c86/32.png) [@Lorenzo\_P](https://www.ruby-forum.com/u/Lorenzo_P)\
**Post date:** [July 5, 2007, 4:17pm UTC](https://www.ruby-forum.com/t/habtm/108626/5 "2007-07-05T16:17:27Z")

</div>

Pe forza!!!

Il 05/07/07, Stefano G. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) ha scritto:

---

<div class="post-metadata">

**Author:** ![Lorenzo\_P](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/l/858c86/32.png) [@Lorenzo\_P](https://www.ruby-forum.com/u/Lorenzo_P)\
**Post date:** [July 5, 2007, 4:16pm UTC](https://www.ruby-forum.com/t/habtm/108626/6 "2007-07-05T16:16:27Z")

</div>

Lorè, stasera passi a casa mia, dopo cena, viè presto che ce ne avremo de  
cose da fa…

Bella

jeko

---

<div class="post-metadata">

**Author:** ![Lorenzo\_P](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/l/858c86/32.png) [@Lorenzo\_P](https://www.ruby-forum.com/u/Lorenzo_P)\
**Post date:** [July 9, 2007, 12:49pm UTC](https://www.ruby-forum.com/t/habtm/108626/7 "2007-07-09T12:49:50Z")

</div>

Ciao, scusa per il ritardo. Basta aggiungere la seguente riga a #create  
(ovviamente prima di salvare).  
@receipt.products \<\< Product.find(params[:product\_ids])

Quando usi la macro HABTM, ActiveRecord crea un attributo di istanza,  
che corrisponde (secondo convenzione) al nome della classe endpoint  
pluralizzato. ES: Product #=\> products

Con la riga aggiunta, vai a leggere dalla request i parametri checked,  
tramite find carichi dal db i relativi oggetti e li accodi alla  
collection products.

Da notare che la chiamata al db è unica, perché verrà utilizzata  
(internamente ad AR) la versione del find con array di id, cioè un’unica  
where condition, invece che n query.

La magia di rails provvederà poi, a salvare le relazioni quando verrà  
invocato #save.

PS: Non ho avuto il tempo di testare il codice, quindi se c’è qualche  
errore o dubbio, comunicamelo.

Ciao.
