Erweiterung von ActiveRecord :: Base

8

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:

%Vor%

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?

    
Simon Soriano 20.08.2015, 18:01
quelle

2 Antworten

1

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:

  1. column.type ist ein Symbol und ich habe es mit einem String verglichen.
  2. base.define_method ist eine private Methode
  3. Ich musste die Methoden in der singleton_class definieren, nicht in der base Klasse oder der class .
  4. 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:

%Vor%     
Simon Soriano 07.09.2015, 18:55
quelle
3

Mit Rails 4.1.9 und Ruby 2.2.1 habe ich ein paar Probleme mit dem obigen Code bemerkt.

  1. Sie vergleichen column.type mit Zeichenfolgen und Rails gibt Symbole für dieses Attribut zurück.
  2. base.define_method versucht eine private Methode aufzurufen, das kannst du mit send umgehen

Dies ist der optimierte Code

%Vor%     
yez 20.08.2015 20:50
quelle