Nome tabella in una variabile, come fare selec

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

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")

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

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

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),
senza bisogno di usare la reflection.

LG

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),
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)

Grazie mille Ciao