Forum: Italian Ruby user group HABTM

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
F9ac36eec5227f65d567b08e3e08c760?d=identicon&s=25 Lorenzo Pagano (Guest)
on 2007-07-05 14:02
(Received via mailing list)
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
[...]
<ul>
<% Product.find(:all).each do |g| %>
  <li>
        <%= g.codice %>
        <input type="checkbox" name="product[product_ids][]"
        value="<%= g.id %>" <% if  @receipt.products.include?(g)
%>checked="checked" <%
end %> />
  </li>
<% end %>
</ul>
[...]
----------------------------------------------------------------------------------------------------------------
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
114ff87909d3f24150ff3d70d5254338?d=identicon&s=25 Luca Guidi (Guest)
on 2007-07-05 14:39
(Received via mailing list)
Lorenzo Pagano 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?
F9ac36eec5227f65d567b08e3e08c760?d=identicon&s=25 Lorenzo Pagano (Guest)
on 2007-07-05 14:42
(Received via mailing list)
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 Guidi <guidi.luca@gmail.com> ha scritto:
F9ac36eec5227f65d567b08e3e08c760?d=identicon&s=25 Lorenzo Pagano (Guest)
on 2007-07-05 14:49
(Received via mailing list)
A... Dimenticavo... Grazie per l'interessamento!!!

Il 05/07/07, Lorenzo Pagano <lorenzo.pagano@gmail.com> ha scritto:
Cbe503ad4dc0a47353b8dd04ea77a9fb?d=identicon&s=25 Stefano Guglielmetti (Guest)
on 2007-07-05 16:16
(Received via mailing list)
Lorè, stasera passi a casa mia, dopo cena, viè presto che ce ne avremo de
cose da fa...

Bella

jeko
F9ac36eec5227f65d567b08e3e08c760?d=identicon&s=25 Lorenzo Pagano (Guest)
on 2007-07-05 16:17
(Received via mailing list)
Pe forza!!!

Il 05/07/07, Stefano Guglielmetti <StefanoG@interact.it> ha scritto:
114ff87909d3f24150ff3d70d5254338?d=identicon&s=25 Luca Guidi (Guest)
on 2007-07-09 12:49
(Received via mailing list)
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.
This topic is locked and can not be replied to.