Forum: Italian Ruby user group ActiveRecord id()

52d1e5b770dd08e870da944c1205a9fc?d=identicon&s=25 Alessandro Campagni (Guest)
on 2013-10-03 11:44
(Received via mailing list)
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
5ffafe70176a99f175d16192fd5be69e?d=identicon&s=25 Luca P. (luca_p)
on 2013-10-03 11:45
(Received via mailing list)
Non ho una risposta, ma ho la sensazione che sia "cercarsi delle grane"
:D

--
Luca Pradovera
luca.pradovera@gmail.com
52d1e5b770dd08e870da944c1205a9fc?d=identicon&s=25 Alessandro Campagni (Guest)
on 2013-10-03 11:47
(Received via mailing list)
On Oct 3, 2013 11:45 AM, "Luca Pradovera" <luca.pradovera@gmail.com>
wrote:
>
> Non ho una risposta, ma ho la sensazione che sia "cercarsi delle grane" :D

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

>
> --
> Luca Pradovera
> luca.pradovera@gmail.com
>
>
>
>
> On Oct 3, 2013, at 11:43 AM, Alessandro Campagni <
alessandro.campagni@gmail.com> 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?
491498f4267723724c20a244fb1060c5?d=identicon&s=25 Maurizio (Guest)
on 2013-10-03 12:13
(Received via mailing list)
Il 03/10/2013 11:43, Alessandro Campagni 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).
F8990e1991980f60be9ab371a214a21d?d=identicon&s=25 Federico Ravasio (razielgn)
on 2013-10-03 14:00
(Received via mailing list)
No in realt va overridato il metodo d'istanza "to_param".

Excuse me for not top quoting - sent from mobile.
F8990e1991980f60be9ab371a214a21d?d=identicon&s=25 Federico Ravasio (razielgn)
on 2013-10-03 14:01
(Received via mailing list)
Ah scusa, ho capito che ti serviva per generare url senza l'id. Svista.

Excuse me for not top quoting - sent from mobile.
52d1e5b770dd08e870da944c1205a9fc?d=identicon&s=25 Alessandro Campagni (Guest)
on 2013-10-03 14:25
(Received via mailing list)
On Oct 3, 2013 12:13 PM, "Maurizio" <druzn3k@18months.it> 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
491498f4267723724c20a244fb1060c5?d=identicon&s=25 Maurizio (Guest)
on 2013-10-03 15:29
(Received via mailing list)
Il 03/10/2013 14:24, Alessandro Campagni 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] https://github.com/ggreer/the_silver_searcher
E555a767a33427bfee0bb0878566293c?d=identicon&s=25 gabriele renzi (Guest)
on 2013-10-03 18:16
(Received via mailing list)
+1 per ack/ag.
Il secondo  effettivamente un missile, ma rispetto a ack manca della
fondamentale l'opzione --thpppt.


2013/10/3 Maurizio <druzn3k@18months.it>

> 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] https://github.com/ggreer/the_silver_searcher
> _______________________________________________
> Ml mailing list
> Ml@lists.ruby-it.org
> http://lists.ruby-it.org/mailman/listinfo/ml
>



--
twitter: @riffraff
blog (en, it): www.riffraff.info riffraff.blogsome.com
work: circleme.com
52d1e5b770dd08e870da944c1205a9fc?d=identicon&s=25 Alessandro Campagni (Guest)
on 2013-10-04 06:41
(Received via mailing list)
C' anche ag.el per Emacs, non posso non provarlo! Io per il C uso ctags
e
find+grep.
Grazie ancora
Please log in before posting. Registration is free and takes only a minute.
Existing account

NEW: Do you have a Google/GoogleMail, Yahoo or Facebook account? No registration required!
Log in with Google account | Log in with Yahoo account | Log in with Facebook account
No account? Register here.