ActiveRecord id()

Salve,
Stavo spippolando e mi ero lanciato in una porcheria:

class Antani < ActiveRecord::Base
def id
somethingelse
end
end

Ma scopro con “dispiacere” che qualunque cosa metta dentro quel metodo
lui
continuer sempre a ritornarmi il valore della primary key.
La domanda sbaglio qualcosa o non possibile ridefinire questo metodo?

Grazie
sciamp

Non ho una risposta, ma ho la sensazione che sia “cercarsi delle grane”
:smiley:


Luca P.
[email protected]

On Oct 3, 2013 11:45 AM, “Luca P.” [email protected]
wrote:

Non ho una risposta, ma ho la sensazione che sia “cercarsi delle grane” :smiley:

Pienamente d’accordo con te! Infatti sto risolvendo il problema in
maniera
un pochino meno violenta, ma la curiosit rimane :slight_smile:


Luca P.
[email protected]

On Oct 3, 2013, at 11:43 AM, Alessandro C. <
[email protected]> wrote:

Ma scopro con “dispiacere” che qualunque cosa metta dentro quel metodo
lui
continuer sempre a ritornarmi il valore della primary key.
La domanda sbaglio qualcosa o non possibile ridefinire questo
metodo?

Il 03/10/2013 11:43, Alessandro C. ha scritto:

continuer sempre a ritornarmi il valore della primary key.
La domanda sbaglio qualcosa o non possibile ridefinire questo metodo?

Grazie
sciamp

Ho provato a sperimentare, ma riesco a sovrascriverlo tranquillamente.
L’unica traccia che sono riuscito poi a trovare nel codice ActiveRecord
che potrebbe dare un senso al tuo problema questo:

activerecord/lib/active_record/attribute_methods/primary_key.rb

da 55 a 59

ID_ATTRIBUTE_METHODS = %w(id id= id? id_before_type_cast).to_set

def dangerous_attribute_method?(method_name)
super && !ID_ATTRIBUTE_METHODS.include?(method_name)
end
############################ fine

che viene richiamato in:

activerecord/lib/active_record/attribute_methods.rb

da 99 a 111

def instance_method_already_implemented?(method_name)
if dangerous_attribute_method?(method_name)
raise DangerousAttributeError, “#{method_name} is defined by Active
Record”
end

if superclass == Base
super
else
# If B < A and A defines its own attribute method, then we don’t
want to overwrite that.
defined = method_defined_within?(method_name, superclass,
superclass.generated_attribute_methods)
defined && !ActiveRecord::Base.method_defined?(method_name) || super
end
end
############################ fine

Per questo metodo richiamato solo in
activemodel/lib/active_model/attribute_methods.rb, alla riga 293. Quindi
l’ipotesi sta in piedi cos e cos. Ma con tutta la magia su cui si
tiene su ActiveRecord, potrebbe anche essere che in un guazzabuglio di
metaprogrammazione quel metodo venga chiamato.

Tutto il codice tratto dalla versione nel master di github. Non penso
di essere stato eccessivamente utile, per una buona base per
investigare il problema te l’ho data (spero :P).

No in realt va overridato il metodo d’istanza “to_param”.

Excuse me for not top quoting - sent from mobile.

On Oct 3, 2013 12:13 PM, “Maurizio” [email protected] wrote:

Ma scopro con “dispiacere” che qualunque cosa metta dentro quel metodo
lui
continuer sempre a ritornarmi il valore della primary key.
La domanda sbaglio qualcosa o non possibile ridefinire questo
metodo?
ID_ATTRIBUTE_METHODS = %w(id id= id? id_before_type_cast).to_set
def instance_method_already_implemented?(method_name)
defined = method_defined_within?(method_name, superclass,
metaprogrammazione quel metodo venga chiamato.

Tutto il codice tratto dalla versione nel master di github. Non penso
di essere stato eccessivamente utile,
per una buona base per
investigare il problema te l’ho data (spero :P).

Grazie, molto utile invece! Avevo provato a leggere del codice, ma data
la
mia niubbitudine galoppante non ero riuscito ad isolare le parti di
codice
interessanti, ci dar un occhio.

Grazie ancora
sciamp

Ah scusa, ho capito che ti serviva per generare url senza l’id. Svista.

Excuse me for not top quoting - sent from mobile.

Il 03/10/2013 14:24, Alessandro C. ha scritto:

Grazie, molto utile invece! Avevo provato a leggere del codice, ma data la
mia niubbitudine galoppante non ero riuscito ad isolare le parti di codice
interessanti, ci dar un occhio.

Grazie ancora
sciamp

Per cercare in maniera efficace nel codice uso ACK oppure AG, che sono
veloci come il vento (ag soprattutto, di diversi ordini di grandezza
rispetto ad ack) e ottimi per la ricerca nel codice.

[1] http://beyondgrep.com/
[2] GitHub - ggreer/the_silver_searcher: A code-searching tool similar to ack, but faster.

C’ anche ag.el per Emacs, non posso non provarlo! Io per il C uso ctags
e
find+grep.
Grazie ancora

+1 per ack/ag.
Il secondo effettivamente un missile, ma rispetto a ack manca della
fondamentale l’opzione --thpppt.

2013/10/3 Maurizio [email protected]

Per cercare in maniera efficace nel codice uso ACK oppure AG, che sono
veloci come il vento (ag soprattutto, di diversi ordini di grandezza
rispetto ad ack) e ottimi per la ricerca nel codice.

[1] http://beyondgrep.com/
[2] GitHub - ggreer/the_silver_searcher: A code-searching tool similar to ack, but faster.


Ml mailing list
[email protected]
http://lists.ruby-it.org/mailman/listinfo/ml


twitter: @riffraff
blog (en, it): www.riffraff.info riffraff.blogsome.com
work: circleme.com