Nome tabella in una variabile, come fare selec


#1

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


#2

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


#3

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


#4

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


#5

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
(http://www.martinfowler.com/eaaCatalog/singleTableInheritance.html),
senza bisogno di usare la reflection.

LG


#6

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

Grazie mille Ciao