# Nome tabella in una variabile, come fare selec

**URL:** <https://www.ruby-forum.com/t/nome-tabella-in-una-variabile-come-fare-selec/110947>\
**Category:** IT\
**Created:** [August 1, 2007, 9:53am UTC](https://www.ruby-forum.com/t/nome-tabella-in-una-variabile-come-fare-selec/110947 "2007-08-01T09:53:34Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![enzo\_ferro](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/e/977dab/32.png) [@enzo\_ferro](https://www.ruby-forum.com/u/enzo_ferro)\
**Post date:** [August 1, 2007, 9:53am UTC](https://www.ruby-forum.com/t/nome-tabella-in-una-variabile-come-fare-selec/110947/1 "2007-08-01T09:53:34Z")

</div>

Ciao a tutti,  
nel metodo show della mia applicazione ho una variabile che viene  
caricata con una stringa di testo contenente il nome della tabella  
sulla quale dovrÃ² andare a fare un operazione select.  
Come posso fare ad inserire il contentuto di questa variabile  
nell’istruzione select?

Questo Ã¨ il mio metodo show:

def show  
@file = FileList.find(params[:id])  
typename = @file.file\_type.filetype  
end

typename contiene il nome della tabella su cui dovrÃ² andare a fare una  
select per visualizzare il file xml corrispondente al record @file.  
Quello che vorrei ottenere sarebbe una cosa del genere:

@xml = @file.‘contenuto di typename’.file

Qualche idea?

Grazie

---

<div class="post-metadata">

**Author:** ![enzo\_ferro](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/e/977dab/32.png) [@enzo\_ferro](https://www.ruby-forum.com/u/enzo_ferro)\
**Post date:** [August 1, 2007, 10:01am UTC](https://www.ruby-forum.com/t/nome-tabella-in-una-variabile-come-fare-selec/110947/2 "2007-08-01T10:01:39Z")

</div>

On Wed, 1 Aug 2007 09:53:34 +0200, Enzo F. wrote:

> @file = FileList.find(params[:id])  
> typename = @file.file\_type.filetype  
> end
> 
> typename contiene il nome della tabella su cui dovrò andare a fare una  
> select per visualizzare il file xml corrispondente al record @file.  
> Quello che vorrei ottenere sarebbe una cosa del genere:
> 
> @xml = @file.‘contenuto di typename’.file

@file.call(typename).file

oppure:

eval("@file.#{typename}.file")

---

<div class="post-metadata">

**Author:** ![enzo\_ferro](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/e/977dab/32.png) [@enzo\_ferro](https://www.ruby-forum.com/u/enzo_ferro)\
**Post date:** [August 1, 2007, 10:10am UTC](https://www.ruby-forum.com/t/nome-tabella-in-una-variabile-come-fare-selec/110947/3 "2007-08-01T10:10:40Z")

</div>

Ciao Enzo,

Ti sconsiglio questa pratica, perchÃ© esponi il tuo database in modo  
eccessivo. Se nella request la stringa assumesse valore users o admins?

LG

---

<div class="post-metadata">

**Author:** ![enzo\_ferro](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/e/977dab/32.png) [@enzo\_ferro](https://www.ruby-forum.com/u/enzo_ferro)\
**Post date:** [August 1, 2007, 11:22am UTC](https://www.ruby-forum.com/t/nome-tabella-in-una-variabile-come-fare-selec/110947/4 "2007-08-01T11:22:47Z")

</div>

> Ti sconsiglio questa pratica, perchÃ© esponi il tuo database in modo  
> eccessivo. Se nella request la stringa assumesse valore users o admins?

Ciao Luca, accetto volentieri consigli.  
Ti spiego il mio caso: ho una tabella file\_list dalla quale recupero le  
informazioni(id, file\_name, id\_file\_type) di alcuni file xml contenuti  
nel mio db. A questa tabella sono collegate cinque tabelle nelle quali  
sono contenuti i file xml. Il nome di queste tabelle corrisponde al  
contenuto della tabella file\_type.  
Utilizzando il file\_type io creo una query per recuperare il file xml da  
una delle cinque tabelle.

Per capirci meglio nel mio metodo show:

def show  
@file = FileList.find(params[:id])  
typename = @file.file\_type.filetype  
eval("@file.#{typename}.file")  
end

1. carico le informazioni del singolo record dalla tabella file\_list che  
ha il campo id\_file\_type come foreign\_key della tabella file\_type

2. carico la variabile typename con il file\_type che corrisponde al nome  
di una delle cinque tabelle che contengono il file xml

3. costruisco una query che dovrebbe risultare cosÃ¬:  
SELECT \* FROM ‘typename’ WHERE SELECT \* FROM other WHERE  
(‘typename’.id = 60)

Potresti consigliarmi il metodo migliore e piÃ¹ sicuro di realizzazione?  
Come avrai capito sono alle prime armi di RoR

Grazie ciao

---

<div class="post-metadata">

**Author:** ![enzo\_ferro](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/e/977dab/32.png) [@enzo\_ferro](https://www.ruby-forum.com/u/enzo_ferro)\
**Post date:** [August 1, 2007, 12:00pm UTC](https://www.ruby-forum.com/t/nome-tabella-in-una-variabile-come-fare-selec/110947/5 "2007-08-01T12:00:55Z")

</div>

Le cinque tabelle sono mappate da oggetti Ruby? CioÃ¨ fanno parte del  
model domain di Rails?

Supponi di avere una classe Calendar per la relativa tabella calendars e  
che il param id referenzi il seguente record:  
id | file\_name | id\_file\_type  
123 | calendar.xml | calendar

def show  
file = FileList.find(params[:id])  
klass = file.file\_type.capitalize.constantize #=\> Calendar  
@file = klass.find\_by\_file\_name(file.file\_name) #=\> select \* from  
calendars where file\_name = ‘calendar.xml’  
end

Non Ã¨ molto elegante, ma intuisco che lo schema db Ã¨ legacy, perchÃ©  
avresti potuto risolvere con la Single Table Inheritance  
([P of EAA: Single Table Inheritance](http://www.martinfowler.com/eaaCatalog/singleTableInheritance.html)),  
senza bisogno di usare la reflection.

LG

---

<div class="post-metadata">

**Author:** ![enzo\_ferro](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/e/977dab/32.png) [@enzo\_ferro](https://www.ruby-forum.com/u/enzo_ferro)\
**Post date:** [August 1, 2007, 12:28pm UTC](https://www.ruby-forum.com/t/nome-tabella-in-una-variabile-come-fare-selec/110947/6 "2007-08-01T12:28:50Z")

</div>

Luca G. wrote:

> Le cinque tabelle sono mappate da oggetti Ruby? CioÃ¨ fanno parte del  
> model domain di Rails?
> 
> Supponi di avere una classe Calendar per la relativa tabella calendars e  
> che il param id referenzi il seguente record:  
> id | file\_name | id\_file\_type  
> 123 | calendar.xml | calendar
> 
> def show  
> file = FileList.find(params[:id])  
> klass = file.file\_type.capitalize.constantize #=\> Calendar  
> @file = klass.find\_by\_file\_name(file.file\_name) #=\> select \* from  
> calendars where file\_name = ‘calendar.xml’  
> end
> 
> Non Ã¨ molto elegante, ma intuisco che lo schema db Ã¨ legacy, perchÃ©  
> avresti potuto risolvere con la Single Table Inheritance  
> ([P of EAA: Single Table Inheritance](http://www.martinfowler.com/eaaCatalog/singleTableInheritance.html)),  
> senza bisogno di usare la reflection.
> 
> LG

SÃ¬ le cinque tabella sono mappate da oggetti Ruby, ogniuna ha il suo  
model.  
SÃ¬ purtroppo il db Ã¨ legacy, cmq leggendo “Agile web development with  
rails” ho trovato il capitolo sulle polimorphic associations che sembra  
fare al caso mio (almeno penso).  
[http://wiki.rubyonrails.org/rails/pages/UnderstandingPolymorphicAssociations](http://wiki.rubyonrails.org/rails/pages/UnderstandingPolymorphicAssociations))

Grazie mille Ciao
