Destroy di un record

Salve a tutti, avrei un problema su come distruggere un record di una
tabella esterna. Praticamente ho una relazione “uno a uno” fra le
tabelle Album e Download e ho il seguente codice:

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


end

class Download < ActiveRecord::Base
belongs_to :album


end

Teoricamente se distruggo l’album, si drovrebbe distruggere anche il
relativo download giusto? Però non accade. Ho provato con il togliere
“:dependent => :destroy” e aggiungere nel controller dell’album:

def destroy
@album = Album.find(params[:id])
Album.find(:first, :conditions => [“album_id = ?”,
params[:id]]).destroy
@album.destroy

........

end

Anche così facendo non mi cancella il record nella tabella Download,
sapete darmi una dritta??
Grazie mille

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

Lorenzo C. 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

Chiedo scusa, infatti ho sbagliato a scrivere, in realtà avevo fatto:

Download.find(:first, :conditions => [“album_id = ?”,
params[:id]]).destroy

E anche così non funzionava…comunque ho risolto il problema
semplicemente con la
:dependent => :destroy, non so come ma alla fine è andato tutto a
posto!! Grazie mille