Rails: Come estrarre solo i campi calcolati da un modello?

Salve a tutti,

Ho una serie di modelli AR con dei campi calcolati, e l’esigenza di
poterli “esportare” per mezzo dei metodi come to_xml e/o to_json. Esiste
un modo
agevole senza ricorrere a prefissi sugli stessi per individuarli nel
“marasma” di “public_methods”?

Avevo pensato a una cosa simile:

m1 = ActiveRecord::Base.public_methods
m2 = istanza_del_modello.public_methods
m3 = m2 - m1

Funzionicchia, nel senso che mi trovo m3 sfoltito dei metodi comuni di
AR, tuttavia, ci sono altri metodi (es “lock!”) che mi inquinano il
risultato.

Come ho detto vorrei, se possibile, evitare di aggiungere prefissi ai
miei campi calcolati (es: “calc_nome_campo”). C’è qualcosa che posso
fare?

Ringrazio in anticipo.

Carmine M. wrote:

Salve a tutti,

Ho una serie di modelli AR con dei campi calcolati, e l’esigenza di
poterli “esportare” per mezzo dei metodi come to_xml e/o to_json. Esiste
un modo
agevole senza ricorrere a prefissi sugli stessi per individuarli nel
“marasma” di “public_methods”?

Non sono sicuro di aver capito il problema: cosa intendi per campi
calcolati? Che non esistono sul db ma sono il risultato di un count?
Per quale motivo non puoi usare istanza_del_modello.columns?

S2 Akira wrote:

Non sono sicuro di aver capito il problema: cosa intendi per campi
calcolati? Che non esistono sul db ma sono il risultato di un count?

Si esattamente, proprio campi/attributi che sono definiti nella classe
“modello.rb” e non nella migration.

Per quale motivo non puoi usare istanza_del_modello.columns?

Perchè dal RDoc di RoR leggo:
columns()
Returns an array of column objects for the table associated with this
class.

A me servirebbe poter, data una classe:

class modello < ActiveRecord::Base

def campo_calcolato
campo_del_db * 0,20
end

end

Ed un’istanza x = modello.new

Vorrei che x.to_json (ad esempio), mi restituisse anche
“campo_calcolato”.

Per il momento ho, mio malgrado, messo anche i campi calcolati nel DB.
Tuttavia, nonostante l’occupazione complessiva sia davvero irrisoria, la
cosa mi infastidisce.

Che faccio?

Grazie dell’aiuto.

Carmine M. wrote:

Perchè dal RDoc di RoR leggo:
columns()
Returns an array of column objects for the table associated with this
class.

A me servirebbe poter, data una classe:

class modello < ActiveRecord::Base

def campo_calcolato
campo_del_db * 0,20
end

end

Ed un’istanza x = modello.new

Vorrei che x.to_json (ad esempio), mi restituisse anche
“campo_calcolato”.

Per il momento ho, mio malgrado, messo anche i campi calcolati nel DB.
Tuttavia, nonostante l’occupazione complessiva sia davvero irrisoria, la
cosa mi infastidisce.

Che faccio?

Grazie dell’aiuto.

Io farei così:

<% a = Prova.find(1, :select => ‘tabella.*, numero * 0.2
colonna_calcolata’) %>
<%= a.to_json %>

Carmine M. wrote:

Ed anche io se ci fossi arrivato prima :slight_smile:

GRAZIE 10000 del tuo aiuto.

figurati, per così poco :slight_smile:

S2 Akira wrote:

Io farei così:

<% a = Prova.find(1, :select => ‘tabella.*, numero * 0.2
colonna_calcolata’) %>
<%= a.to_json %>

Ed anche io se ci fossi arrivato prima :slight_smile:

GRAZIE 10000 del tuo aiuto.

S2 Akira wrote:

Carmine M. wrote:

Ed anche io se ci fossi arrivato prima :slight_smile:

GRAZIE 10000 del tuo aiuto.

figurati, per così poco :slight_smile:

sì questo ti funiona se i campi calcolati sono semplici.

Per diverse ragioni in sviluppo ho spesso incontrato difficoltà nel
creare funzioni/viste automatiche che si comportassero differentemente a
seconda del tipo di campo di ar da estire o eventualmente della
funzione.

Per ovviare a questo accompagno ogni nuovo model che genero con un
oggetto che descrive metodi, campi etc, così ad es se devo creare una
form l’helper sa già se un campo è un has_many, un belongs_to, una
function da ignorare nella form etc etc… posso anche esporre
interfacce ad hoc in questo modo ad es so se un model mi fornisce un
interfaccia particolare o cmq posso autogenerare chiamate etc…

In definitiva, non è che ar o altro ti forniscano sempre tutta la pappa
pronta… a volte se devi fare cose complesse devi scrivertele tu :slight_smile: