Ciao a tutti,
ho qualche problemino con le associazioni has_many :through.
Si tratta di questo:
ammettiamo di avere siti e applicazioni con una associazione many to
many via through association (perchè nella tabella di link devo gestire
altre proprietà):
Siti: id, name
class Site < ActiveRecord::Base
has_many :link_site_apps, :dependent => :destroy
has_many :apps, :dependent => :destroy, :through => :link_site_apps
end
Applicazioni: id, name
class App < ActiveRecord::Base
has_many :link_site_apps, :dependent => :destroy
has_many :sites, :dependent => :destroy, :through => :link_site_apps
end
Collegamento siti/applicazioni: site_id, app_id, is_active (boolean)
class LinkSiteApp < ActiveRecord::Base
belongs_to :app
belongs_to :site
end
- Se provo ad associare le prime 3 applicazioni al sito mediante
site = Site.find(1)
site.apps = App.find([1,2,3])
site.save!
non ottengo alcun errore ma non scrive nulla nel db, mentre con:
site.apps << App.find([1,2,3])
funziona, ma se voglio aggiornare le associazioni impostando solo le
prime 2 applicazioni si rende necessario eseguire prima:
site.link_site_apps.delete_all (NB: DEVO USARE IL LINK PERCHÈ ESEGUENDO
site.apps.delete_all MI VA IN ERRORE…)
e poi il ricaricamento con
site.apps << App.find([1,2])
dovendo obbligatoriamente passare per il “link di associazione”
(link_site_apps) e questo non lo capisco perchè con habtm era
sufficiente assegnare site.apps e tutto funzionava correttamente…
- Con rails 1.2.x nella view era sufficiente impostare l’input per le
associazioni many to many con nome “app_ids[]” e tutto andava liscio, se
faccio questo con “through association” se ne sbatte altamente (penso
per il problema al punto 1) e quindi sono costretto ad intervenire
eliminando prima tutte le associazioni (site.link_site_apps.delete_all)
e poi ricaricando le apps (site.apps << App.find(params[:app_ids])); mi
chiedo quindi quali sono le “best practices” di view e controller per
gestire al meglio le associazioni multiple “through” (mi piacerebbe
intervenire in memoria prima del salvataggio del model come si faceva
con habtm (site.apps = App.find…) perchè eseguire il delete_all e poi
l’inserimento tramite << presuppone che l’oggetto sia già stato salvato
e quindi mi forza ad utilizzare le transazioni per essere certo che a
metà strada si possa eseguire il rollback…
Qualcuno sa darmi qualche dritta ?
Grazie in anticipo !