[ruby-it] Destroy di un record

Paolo Montrasio paolo a paolomontrasio.com
Ven 11 Dic 2009 09:07:20 CET


Premessa: non ho fatto prove con il codice e quindi la disamina 
successiva è soggetta a bug anche grossi, tuttavia...

Lorenzo Caniato wrote:
> def destroy
>     @album = Album.find(params[:id])
>     Album.find(:first, :conditions => ["album_id = ?",
>       params[:id]]).destroy
>     @album.destroy
> 
>     ........
> end

Mi pare strano che la tabella albums abbia un attributo album_id. 
Rimanda a sé stessa? Mi sarei atteso download_id.
Il problema in realtà si capisce guardando il codice dei due modelli.

Cito 
http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#M001834

> class Album < ActiveRecord::Base
>  has_one :download, :dependent => :destroy

has_one: "This method should only be used if the other class contains 
the foreign key. If the current class contains the foreign key, then you 
should use belongs_to instead."

Quindi albums non conterrà nessuna foreign key: né album_id (ovvio) né 
download_id.

>  ..........
> end
>
> class Download < ActiveRecord::Base
>  belongs_to :album

Quindi downloads dovrà avere un attributo album_id

Se invece vuoi che albums abbia download_id dovrai mettere

  belongs_to :download, :dependent => :destroy

in album.rb e

  has_one :album

in download.rb. Che sia l'album ad appartenere (belongs_to) al download 
mi sembra poco naturale da leggere per cui lascerei le cose come sono 
nei modelli correggendo solo gli attributi nelle tabelle.

La dependent destroy probabilissimamente non funzionava perché attributi 
e  associazioni erano in contraddizione. Una volta corretti nel 
controller dovrebbe bastare

  @album = Album.find(params[:id])
  @album.destroy

Paolo


>  ..........
> end

-- 
Posted via http://www.ruby-forum.com/.


More information about the Ml mailing list