Forum: Italian Ruby user group Nome tabella in una variabile, come fare selec

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
2c164d5c437fe95f98979c24cc4aa1c7?d=identicon&s=25 Enzo Ferro (enzo_ferro)
on 2007-08-01 09:53
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
Aea9ee14e387a68f5cd63048a0ba9266?d=identicon&s=25 David (Guest)
on 2007-08-01 10:01
(Received via mailing list)
On Wed, 1 Aug 2007 09:53:34 +0200, Enzo Ferro 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")
114ff87909d3f24150ff3d70d5254338?d=identicon&s=25 Luca Guidi (Guest)
on 2007-08-01 10:10
(Received via mailing list)
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
2c164d5c437fe95f98979c24cc4aa1c7?d=identicon&s=25 Enzo Ferro (enzo_ferro)
on 2007-08-01 11:22
> 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
114ff87909d3f24150ff3d70d5254338?d=identicon&s=25 Luca Guidi (Guest)
on 2007-08-01 12:00
(Received via mailing list)
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/singleTable...),
senza bisogno di usare la reflection.


LG
2c164d5c437fe95f98979c24cc4aa1c7?d=identicon&s=25 Enzo Ferro (enzo_ferro)
on 2007-08-01 12:28
Luca Guidi 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/singleTable...),
> 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/Understand...)

Grazie mille Ciao
This topic is locked and can not be replied to.