Ich versuche, ActiveRecord einige benutzerdefinierte Methoden hinzuzufügen. Ich möchte ein *_after
und *_before
Bereiche für jedes date
Feld eines Modells hinzufügen, damit ich etwas wie folgt machen kann:
Ich habe die hier erläuterte Lösung Rails, die ActiveRecord :: Base erweitern , verfolgt Wenn ich die Rails-Konsole ausfühle und versuche, die Methoden aufzurufen, bekomme ich einen undefined method
-Fehler.
Hier ist mein Code:
%Vor%Was mache ich falsch?
Dank der vorherigen Antwort habe ich einen Teil der Probleme realisiert. Hier sind alle Probleme und die Lösung, nach der ich nach einigen Recherchen gekommen bin:
column.type
ist ein Symbol und ich habe es mit einem String verglichen. base.define_method
ist eine private Methode singleton_class
definieren, nicht in der base
Klasse oder der class
. Rails.application.eager_load!
führt zu eifriger Last, auch wenn sie nicht benötigt wird. Dies hatte keinen Einfluss auf die Funktionalität, aber in erster Linie sollte die eifrige Ladung nicht Verantwortung für diese "Erweiterung" sein und an zweiter Stelle hängt es in Rails, die "Erweiterung" nur Rails kompatibel machen. Unter Berücksichtigung dieser Probleme habe ich beschlossen, es mit der Funktion method_missing
von Ruby zu implementieren, und ich schrieb dieses Juwel ( Ссылка ) ). Hier ist der relevante Teil für diese Frage:
Mit Rails 4.1.9 und Ruby 2.2.1 habe ich ein paar Probleme mit dem obigen Code bemerkt.
column.type
mit Zeichenfolgen und Rails gibt Symbole für dieses Attribut zurück. base.define_method
versucht eine private Methode aufzurufen, das kannst du mit send
umgehen
Dies ist der optimierte Code
%Vor%Tags und Links ruby ruby-on-rails activerecord ruby-on-rails-4 metaprogramming