# Joins implicite

**URL:** <https://www.ruby-forum.com/t/joins-implicite/198577>\
**Category:** IT\
**Created:** [November 3, 2010, 6:46pm UTC](https://www.ruby-forum.com/t/joins-implicite/198577 "2010-11-03T18:46:57Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![Dobai-Pataky\_BSSSSl](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/77aa72/32.png) [@Dobai-Pataky\_BSSSSl](https://www.ruby-forum.com/u/Dobai-Pataky_BSSSSl)\
**Post date:** [November 3, 2010, 6:46pm UTC](https://www.ruby-forum.com/t/joins-implicite/198577/1 "2010-11-03T18:46:57Z")

</div>

Ciao a tutti,  
ho il seguente problema

C L A S S I

class Quotation  
has\_many: fases  
end

class Fase  
belongs\_to: quotation  
end

nella tabella quotations c’è il campo fase\_id.

la tabella fases è costituita da due campi:  
id  
descrizione

P R O B L E M A  
quando vado a visualizzare il contenuto di quotations vorrei  
visualizzare invece che quotation.fase\_id (che è un numero)

quotation.fase.descrizione

ma rails mi dice che: “fase, undefined method”.

Cosa devo mettere nel controller di quotation per ottenere la  
descrizione di fase ?

Un grazie a tutti, ciao

---

<div class="post-metadata">

**Author:** ![punkaruby](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/p/49beb7/32.png) [@punkaruby](https://www.ruby-forum.com/u/punkaruby)\
**Post date:** [November 3, 2010, 7:11pm UTC](https://www.ruby-forum.com/t/joins-implicite/198577/2 "2010-11-03T19:11:09Z")

</div>

2010/11/3 An Car [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> class Quotation  
> has\_many: fases  
> end
> 
> class Fase  
> belongs\_to: quotation  
> end
> 
> nella tabella quotations c’ il campo fase\_id.

non dovrebbe invece esserci quotation\_id in fase?

> P R O B L E M A  
> quando vado a visualizzare il contenuto di quotations vorrei  
> visualizzare invece che quotation.fase\_id (che un numero)
> 
> quotation.fase.descrizione
> 
> ma rails mi dice che: “fase, undefined method”.

si perch quotation has\_many: fases

er

---

<div class="post-metadata">

**Author:** ![punkaruby](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/p/49beb7/32.png) [@punkaruby](https://www.ruby-forum.com/u/punkaruby)\
**Post date:** [November 3, 2010, 7:14pm UTC](https://www.ruby-forum.com/t/joins-implicite/198577/3 "2010-11-03T19:14:56Z")

</div>

forse ci sono un po’ di errori di impostazione

- se Quotation “has\_many” Fases, perch il campo ‘fase\_id’ nella  
tabella quotations? semmai dovrebbe essere la tabella ‘fases’ ad avere  
un campo ‘quotation\_id’. Oppure devi invertire la dichiarazione nelle  
due classi e dire:

‘Quotation belongs\_to Fase’ e ‘Fase has\_many Quotations’

quindi tutto dipende da cosa devi fare 😛

- in ogni caso, se Fase ‘has\_many’ Quotations, allora dovrai scrivere:

quotation.fase # Quotation ha un Fase di riferimento

fase.quotations # Fase ha un array di Quotations

spero ti sia pi chiaro 😉

A.

Il 03/11/2010 18:46, An Car ha scritto:

---

<div class="post-metadata">

**Author:** ![punkaruby](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/p/49beb7/32.png) [@punkaruby](https://www.ruby-forum.com/u/punkaruby)\
**Post date:** [November 4, 2010, 9:01am UTC](https://www.ruby-forum.com/t/joins-implicite/198577/4 "2010-11-04T09:01:56Z")

</div>

2010/11/4 An Car [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> Mi s che ho esposto la cosa in modo confuso.
> 
> In realt la tabella fases una tabella di “appoggio” ovvero contiene i  
> 5 passaggi che un quotation (budget preventivo) deve avere.  
> Ricapitolando:  
> un quotation deve necessariamente avere 5 fases

quindi quotation ha 5 fases.. e se non ho capito male la tabella fases  
contiene 5 record in tutto giusto? quindi non molti-a-molti.

quindi in teoria con i modelli che hai scritto tu:  
q= Quotation.where…  
q.fases # dovrebbe contenere un’array di 5 fasi

non che le fasi sono gli stati di una quotation? in quel caso dai  
un’occhiata a [http://slagyr.github.com/statemachine/](http://slagyr.github.com/statemachine/)

cheers  
ER

---

<div class="post-metadata">

**Author:** ![punkaruby](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/p/49beb7/32.png) [@punkaruby](https://www.ruby-forum.com/u/punkaruby)\
**Post date:** [November 18, 2010, 10:01am UTC](https://www.ruby-forum.com/t/joins-implicite/198577/5 "2010-11-18T10:01:36Z")

</div>

buon giorno a tutti.  
io ho lo stesso problema ma su una relazione molti a molti…

ho la tabella users e la tabella posts (relazione n:m) collegati tra  
loro con una tabella di join chiamata relations.

nel model user ho scritto:  
has\_many :relations  
has\_many :posts , :through =\> :relations

nel modello post:  
has\_many :relations  
has\_many :users , :through =\> :relations

nel modello relation:  
belongs\_to :post  
belongs\_to :user

la tab relations ha al suo interno user\_id e post\_id.

quando va ad eseguire questo metodo scritto nel modello post:

def Post.find\_user\_per\_post(arg)  
po=Post.find(:all,:conditions=\>[“category=?”,arg])  
@posts=po.users  
end

mi da errore e dice che non esiste un metodo ‘users’ per l array  
ritornato!!  
Sono alle prime armi con rails e questa è un applicazioncina di prova  
per avere un po di dimestichezza con il db, quindi chiedo a voi esperti.

ps.: ho provato sia con mysql che con sqllite3 credendo che fosse un  
problema di db ma purtroppo la situazione è sempre la stessa…

---

<div class="post-metadata">

**Author:** ![punkaruby](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/p/49beb7/32.png) [@punkaruby](https://www.ruby-forum.com/u/punkaruby)\
**Post date:** [November 18, 2010, 12:31pm UTC](https://www.ruby-forum.com/t/joins-implicite/198577/6 "2010-11-18T12:31:47Z")

</div>

2010/11/18 Federico L. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> def Post.find\_user\_per\_post(arg)  
> po=Post.find(:all,:conditions=\>[“category=?”,arg])  
> @posts=po.users  
> end
> 
> mi da errore e dice che non esiste un metodo ‘users’ per l array  
> ritornato!!

Appunto. find :all torna un array! il fatto che esista il metodo  
.users per i singoli membri dell’array non vuol dire che esista per  
l’array stesso, anzi in genere non e’ cosi’, come puoi chiedere il  
nome a una persona ma non a una fila di persone 😉

Ovvero, potresti fare:

@posters = po.map { |p| p.users }.flatten.uniq

(ovvero raccogliere gli utenti dei vari post trovati in un array di  
array, renderlo un unico array unidimensionale, e poi eliminare i  
duplicati.

A dire il vero, a prescindere dal problema da te riscontrato, noto due  
o tre cose strane:

1. chiami il metodo Post.find\_user\_per\_post(arg) ma con ogni evidenza  
il parametro e’ una category, e trova utenti che hanno postato in  
quella category… ovvero non converrebbe chiamarlo  
all\_posters\_for\_category??
2. quando assegni alla variabile di istanza, dici posts = po.users..  
avere una variabile che si chiama “pere” e metterci dentro delle mele  
e’ una ricetta per il disastro!
3. Non e’ chiaro neanche a me quale sia il comportamento usando una  
instance variabile (quelle con una @) dentro un metodo di classe, ma  
penso non faccia quello che vuoi tu.

Saluti!

---

<div class="post-metadata">

**Author:** ![punkaruby](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/p/49beb7/32.png) [@punkaruby](https://www.ruby-forum.com/u/punkaruby)\
**Post date:** [November 18, 2010, 1:01pm UTC](https://www.ruby-forum.com/t/joins-implicite/198577/7 "2010-11-18T13:01:14Z")

</div>

> Appunto. find :all torna un array! il fatto che esista il metodo  
> .users per i singoli membri dell’array non vuol dire che esista per  
> l’array stesso, anzi in genere non e’ cosi’, come puoi chiedere il  
> nome a una persona ma non a una fila di persone 😉

GRAZIE! non ci avevo proprio pensato! ora che me l hai fatto notare è un  
po strano quello che ho scritto…

> 1. chiami il metodo Post.find\_user\_per\_post(arg) ma con ogni evidenza  
> il parametro e’ una category, e trova utenti che hanno postato in  
> quella category… ovvero non converrebbe chiamarlo  
> all\_posters\_for\_category??
> 2. quando assegni alla variabile di istanza, dici posts = po.users..  
> avere una variabile che si chiama “pere” e metterci dentro delle mele  
> e’ una ricetta per il disastro!
> 3. Non e’ chiaro neanche a me quale sia il comportamento usando una  
> instance variabile (quelle con una @) dentro un metodo di classe, ma  
> penso non faccia quello che vuoi tu.

si lo so e mi scuso…i nomi delle variabili e dei metodi non sono molto  
appropriati(oserei dire che fanno riferimento a tutt altro!) ma a furia  
di cambiare e ricambiare il codice ho fatto un pasticcio unico!

comunque grazie mille delle delucidazioni. ora va tutto come deve andare  
😉 (ovviamente riscriverò la mini-applicazione in modo meno  
confusionario.

---

<div class="post-metadata">

**Author:** ![punkaruby](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/p/49beb7/32.png) [@punkaruby](https://www.ruby-forum.com/u/punkaruby)\
**Post date:** [November 4, 2010, 8:02am UTC](https://www.ruby-forum.com/t/joins-implicite/198577/8 "2010-11-04T08:02:36Z")

</div>

Andrea P. wrote in post #959088:

> forse ci sono un po’ di errori di impostazione
> 
> - se Quotation “has\_many” Fases, perch il campo ‘fase\_id’ nella  
> tabella quotations? semmai dovrebbe essere la tabella ‘fases’ ad avere  
> un campo ‘quotation\_id’. Oppure devi invertire la dichiarazione nelle  
> due classi e dire:
> 
> ‘Quotation belongs\_to Fase’ e ‘Fase has\_many Quotations’
> 
> quindi tutto dipende da cosa devi fare 😛
> 
> - in ogni caso, se Fase ‘has\_many’ Quotations, allora dovrai scrivere:
> 
> quotation.fase # Quotation ha un Fase di riferimento
> 
> fase.quotations # Fase ha un array di Quotations
> 
> spero ti sia pi chiaro 😉
> 
> A.
> 
> Il 03/11/2010 18:46, An Car ha scritto:

Mi sà che ho esposto la cosa in modo confuso.

In realtà la tabella fases è una tabella di “appoggio” ovvero contiene i  
5 passaggi che un quotation (budget preventivo) deve avere.

Ricapitolando:  
un quotation deve necessariamente avere 5 fases (e per ciasuna delle  
fases ci sono un quindicina circa di underfases [perdona il miscuglio di  
italiano e inglese maccheronico]).

In sostanza la mia domanda è: nel caso di tabelle come fases e  
underfases (tabelle che “cablano” le possibili scelte dell’utente  
finale) o se si preferisce l’esempio di tabelle quali quelle di  
provincie e relativi comuni (uno sceglie la provincia e poi, in base  
alla provincia scelta, compare una lista di comuni appartenenti a quella  
provincia) come faccio a risalire alla parte descrittiva (in nome della  
fase o della provincia) avendo a disposizione solo l’id nella tabella  
dei dati significativi (nel mio caso la tabella quotation, nel caso  
delle provincie/comuni la tabella con dati anagrafici dell’utente  
finale).

Spero di essere riuscito a spiegarmi meglio.
