Ich habe etwas darüber gelesen, wie die ActiveRecord: Base-Klasse erweitert werden kann, damit meine Modelle einige spezielle Methoden haben. Was ist der einfache Weg, um es zu erweitern (Schritt-für-Schritt-Tutorial)?
ruby-on-rails
extend
rails-activerecord
xpepermint
quelle
quelle
Antworten:
Es gibt verschiedene Ansätze:
Verwenden von ActiveSupport :: Concern (bevorzugt)
Weitere Informationen finden Sie in der Dokumentation zu ActiveSupport :: Concern .
Erstellen Sie eine Datei, die
active_record_extension.rb
imlib
Verzeichnis aufgerufen wird .Erstellen Sie eine Datei in dem
config/initializers
Verzeichnis mit dem Namenextensions.rb
und fügen Sie der Datei die folgende Zeile hinzu:Vererbung (bevorzugt)
Siehe Tobys Antwort .
Affenflicken (sollte vermieden werden)
Erstellen Sie eine Datei im
config/initializers
Verzeichnis mit dem Namenactive_record_monkey_patch.rb
.Das berühmte Zitat über reguläre Ausdrücke von Jamie Zawinski kann neu definiert werden, um die Probleme zu veranschaulichen, die mit dem Patchen von Affen verbunden sind.
Das Patchen von Affen ist einfach und schnell. Die eingesparte Zeit und Mühe wird jedoch immer irgendwann in der Zukunft zurückgewonnen. mit Zinseszins. Heutzutage beschränke ich das Patchen von Affen, um schnell eine Lösung in der Rails-Konsole zu erstellen.
quelle
require
die Datei am Ende vonenvironment.rb
. Ich habe diesen zusätzlichen Schritt zu meiner Antwort hinzugefügt.ImprovedActiveRecord
und von dieser erben. Wenn Sie die Vererbung verwendenmodule
, aktualisieren Sie die Definition der betreffenden Klasse. Ich habe früher die Vererbung verwendet (aufgrund jahrelanger Java / C ++ - Erfahrung). Heutzutage benutze ich meistens Module.Refinements
die die meisten Probleme beim Patchen von Affen behebt ( yehudakatz.com/2010/11/30/ruby-2-0-refinements-in-practice ). Manchmal gibt es eine Funktion, die Sie nur dazu zwingt, das Schicksal in Versuchung zu führen. Und manchmal tust du es.Sie können die Klasse einfach erweitern und einfach die Vererbung verwenden.
quelle
abstract_models
. Wo soll ich es hinstellen?self.abstract_class = true
Ihrem hinzuAbstractModel
. Rails erkennt das Modell nun als abstraktes Modell.AbstractModel
in der Datenbank suchte . Wer wusste, dass ein einfacher Setter mir helfen würde, die Dinge zu trocknen! (Ich fing an zu schaudern ... es war schlimm). Danke Toby und Harish!Sie können auch verwenden
ActiveSupport::Concern
und mehr Rails Kern idiomatisch sein wie:[Bearbeiten] nach dem Kommentar von @daniel
Dann haben alle Ihre Modelle die Methode
foo
als Instanzmethode und die MethodenClassMethods
als Klassenmethoden. ZB auf einem habenFooBar < ActiveRecord::Base
Sie:FooBar.bar
undFooBar#foo
http://api.rubyonrails.org/classes/ActiveSupport/Concern.html
quelle
InstanceMethods
seit Rails 3.2 veraltet ist. Fügen Sie einfach Ihre Methoden in den Modulkörper ein.ActiveRecord::Base.send(:include, MyExtension)
einen Initialisierer eingesetzt und dann hat das bei mir funktioniert. Schienen 4.1.9Mit Rails 4 wurde das Konzept der Verwendung von Bedenken zur Modularisierung und Trocknung Ihrer Modelle hervorgehoben.
Bedenken ermöglichen es Ihnen grundsätzlich, ähnlichen Code eines Modells oder über mehrere Modelle hinweg in einem einzigen Modul zu gruppieren und dieses Modul dann in den Modellen zu verwenden. Hier ist ein Beispiel:
Betrachten Sie ein Artikelmodell, ein Ereignismodell und ein Kommentarmodell. Ein Artikel oder eine Veranstaltung hat viele Kommentare. Ein Kommentar gehört entweder zum Artikel oder zum Ereignis.
Traditionell sehen die Modelle folgendermaßen aus:
Kommentar Modell:
Artikelmodell:
Ereignismodell
Wie wir feststellen können, gibt es einen wichtigen Code, der sowohl dem Ereignis- als auch dem Artikelmodell gemeinsam ist. Mit Bedenken können wir diesen gemeinsamen Code in einem separaten Modul Commentable extrahieren.
Erstellen Sie dazu eine commentable.rb-Datei in App / Model / Concerns.
Und jetzt sehen Ihre Modelle so aus:
Kommentar Modell:
Artikelmodell:
Ereignismodell
Ein Punkt, den ich bei der Verwendung von Bedenken hervorheben möchte, ist, dass Bedenken eher für die domänenbasierte Gruppierung als für die technische Gruppierung verwendet werden sollten. Beispielsweise ist eine Domänengruppierung wie "Kommentierbar", "Taggable" usw. Eine technisch basierte Gruppierung ist wie "FinderMethods", "ValidationMethods".
Hier ist ein Link zu einem Beitrag , den ich sehr nützlich fand, um Bedenken in Modellen zu verstehen.
Hoffe das Aufschreiben hilft :)
quelle
Schritt 1
Schritt 2
Schritt 3
quelle
Die Schienen 5 bieten einen eingebauten Mechanismus zum Ausfahren
ActiveRecord::Base
.Dies wird durch die Bereitstellung einer zusätzlichen Schicht erreicht:
und alle Modelle erben von diesem:
Siehe zB diesen Blogpost .
quelle
Um dieses Thema zu ergänzen, habe ich eine Weile daran gearbeitet, solche Erweiterungen zu testen (ich bin den
ActiveSupport::Concern
Weg gegangen .)So richte ich ein Modell zum Testen meiner Erweiterungen ein.
quelle
Mit Rails 5 werden alle Modelle von ApplicationRecord geerbt und bieten eine gute Möglichkeit, andere Erweiterungsbibliotheken einzuschließen oder zu erweitern.
Angenommen, das Modul für spezielle Methoden muss für alle Modelle verfügbar sein, und fügen Sie es in die Datei application_record.rb ein. Wenn wir dies für einen bestimmten Satz von Modellen anwenden möchten, fügen Sie es in die jeweiligen Modellklassen ein.
Wenn Sie die Methoden im Modul als Klassenmethoden definieren möchten, erweitern Sie das Modul auf ApplicationRecord.
Hoffe es hilft anderen!
quelle
ich habe
in einem Initialisierer
Für ein Modul wie unten
quelle