# Ruby, activerecord e relazioni complicate

**URL:** <https://www.ruby-forum.com/t/ruby-activerecord-e-relazioni-complicate/206300>\
**Category:** IT\
**Created:** [April 27, 2011, 4:02pm UTC](https://www.ruby-forum.com/t/ruby-activerecord-e-relazioni-complicate/206300 "2011-04-27T16:02:39Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![dubstep](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/cdc98d/32.png) [@dubstep](https://www.ruby-forum.com/u/dubstep)\
**Post date:** [April 27, 2011, 4:02pm UTC](https://www.ruby-forum.com/t/ruby-activerecord-e-relazioni-complicate/206300/1 "2011-04-27T16:02:39Z")

</div>

Buongiorno gente.  
Sto cercando di sistemare un programmino in Ruby e gtk2 che sfrutta come  
database mysql; il problema è questo: per i dati che inserisco ho la  
necessità di far comparire alcuni dati come la nazione o altri per due o  
più volte, tipo “nazione provenienza”, “nazione destinazione”, “nazione  
quel\_che\_è”…

Naturalmente fino a che è un’associazione uno-a-molti singola ci arrivo,  
ma in questo caso come si fa? Finora non ho messo in relazione le  
tabelle e ho gestito la cosa a mano, scrivendo direttamente il valore  
che mi serve, ma ultimamente la complessità sta crescendo e una gestione  
relazionale semplificherebbe un po’ di lavoro.  
Sto cercando se c’è documentazione, ma o sbaglio le chiavi o guardo nei  
posti sbagliati…

Come sempre grazie 🙂

---

<div class="post-metadata">

**Author:** ![daneel\_olivaw](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/58f4c7/32.png) [@daneel\_olivaw](https://www.ruby-forum.com/u/daneel_olivaw)\
**Post date:** [April 27, 2011, 6:02pm UTC](https://www.ruby-forum.com/t/ruby-activerecord-e-relazioni-complicate/206300/2 "2011-04-27T18:02:37Z")

</div>

2011/4/27 Daneel O. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> che mi serve, ma ultimamente la complessit sta crescendo e una gestione  
> relazionale semplificherebbe un po’ di lavoro.  
> Sto cercando se c’ documentazione, ma o sbaglio le chiavi o guardo nei  
> posti sbagliati…

Hai almeno due alternative:

Nel caso del concetto di nazione, dove probabilmente l’unica e sola  
cosa che ti interessa e’ il nome della stessa, potresti cercare  
qualche plugin che gestisca gli enum, o farlo a mano salvando un campo  
stringa che poi richiedi tramite validazione che abbia uno dei valori  
permessi  
Se ti serve davvero di modellare il concetto di nazione (il che  
potrebbe essere un po’ palloso e soggetto ad errori, come ad esempio  
avere due nazioni che si chiamano quasi uguali, che in effetti sono la  
stessa, ma tu tratti come diverse), dovresti orientarti sulle  
relazioni polimorfiche, puoi vedere la documentazione di ActiveRecord  
sulla belongs\_to / has\_one ma e’ molto tersa, meglio cercarti qualche  
tutorial o screencast sulle relazioni polimorfiche.

Ciao!

---

<div class="post-metadata">

**Author:** ![daneel\_olivaw](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/58f4c7/32.png) [@daneel\_olivaw](https://www.ruby-forum.com/u/daneel_olivaw)\
**Post date:** [April 28, 2011, 9:02am UTC](https://www.ruby-forum.com/t/ruby-activerecord-e-relazioni-complicate/206300/3 "2011-04-28T09:02:17Z")

</div>

Luca De Marinis wrote in post #995342:

> 2011/4/27 Daneel O. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):
> 
> > che mi serve, ma ultimamente la complessit sta crescendo e una gestione  
> > relazionale semplificherebbe un po’ di lavoro.  
> > Sto cercando se c’ documentazione, ma o sbaglio le chiavi o guardo nei  
> > posti sbagliati…
> 
> Hai almeno due alternative:
> 
> […]
> 
> Ciao!

Alla fine come dicevi mi sono imbattuto nelle relazioni polimorfiche e  
cose simili; ho risolto in questa maniera (semplificando un po’):

class Animals \< ActiveRecord::Base  
belongs\_to :breed, :class\_name =\> “Breeds”  
…  
belongs\_to :naz1, :class\_name =\> “Naz1”  
belongs\_to :naz2, :class\_name =\> “Naz2”  
belongs\_to :naz3, :class\_name =\> “Naz3”  
belongs\_to :naz4, :class\_name =\> “Naz4”  
end

class Nations \< ActiveRecord::Base  
has\_many :nations  
end

class Naz1 \< Nations  
end  
class Naz2 \< Nations  
end  
class Naz3 \< Nations  
end  
class Naz4 \< Nations  
end

e:

selnaz1.each do |n|  
iter1 = listanaz1.append  
iter1[0] = n.id.to\_i  
iter1[1] = n.name  
iter1[2] = n.code  
end

che crea una lista di scelta; per le altre naturalmente è lo stesso…  
sì, non avete idea dei giri che fanno certi animali 🙂

Nel database nella tabella Animals naturalmente ci sono i campi naz1\_id,  
naz2\_id, naz3\_id e naz4\_id.

Nel caso ci siano sistemi migliori, ditemi pure 🙂

Ancora grazie e alla prossima 🙂

---

<div class="post-metadata">

**Author:** ![daneel\_olivaw](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/58f4c7/32.png) [@daneel\_olivaw](https://www.ruby-forum.com/u/daneel_olivaw)\
**Post date:** [April 28, 2011, 9:30am UTC](https://www.ruby-forum.com/t/ruby-activerecord-e-relazioni-complicate/206300/4 "2011-04-28T09:30:38Z")

</div>

> belongs\_to :naz4, :class\_name =\> “Naz4”  
> end

Scusate non ho modo di provare ora, ma non possibile fare una cosa tipo

class Animals \< ActiveRecord::Base  
belongs\_to :breed, :class\_name =\> “Breeds”  
…  
belongs\_to :nations, :as =\> :naz1  
belongs\_to :nations, :as =\> :naz2  
belongs\_to :nations, :as =\> :naz3  
belongs\_to :nations, :as =\> :naz4  
end

Avendo dichiarato pi associazioni a :nations e con :as dandogli nomi  
diversi in tabella non dovrei avere dei campi del tipo naz1\_id, naz2\_id,  
naz3\_id e naz4\_id, oppure :as richiede un associazione polimorfica?

Grazie e saluti
