Habtm


#1

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


#2

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?


#3

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 ha scritto:


#4

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

Il 05/07/07, Lorenzo P. removed_email_address@domain.invalid ha scritto:


#5

Pe forza!!!

Il 05/07/07, Stefano G. removed_email_address@domain.invalid ha scritto:


#6

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

Bella

jeko


#7

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.