Entfernen Sie ActiveRecord in Rails 3

99

Jetzt, da Rails 3 Beta herauskommt, dachte ich, ich würde mir überlegen, eine App neu zu schreiben, an der ich gerade in Rails 3 Beta gearbeitet habe, um ein Gefühl dafür zu bekommen und einen Vorsprung zu bekommen. Die App verwendet MongoDB und MongoMapper für alle Modelle und benötigt daher ActiveRecord nicht. In der vorherigen Version entlade ich Activerecord folgendermaßen:

config.frameworks -= [ :active_record ]    # inside environment.rb

In der neuesten Version funktioniert dies nicht - es wird nur ein Fehler ausgegeben:

/Library/Ruby/Gems/1.8/gems/railties-3.0.0.beta/lib/rails/configuration.rb:126:in
  `frameworks': config.frameworks in no longer supported. See the generated 
  config/boot.rb for steps on how to limit the frameworks that will be loaded 
  (RuntimeError)
 from *snip*

Natürlich habe ich mir die boot.rb so angesehen, wie es vorgeschlagen wurde, aber soweit ich sehen kann, gibt es hier keinen Hinweis darauf, wie ich AR entladen könnte. Der Grund, warum ich dies tun muss, ist, dass es nicht nur albern ist, etwas zu laden, das ich nicht möchte, sondern dass es sich über die Unfähigkeit beschwert, eine DB-Verbindung herzustellen, selbst wenn ich versuche, einen Generator für eine Steuerung zu betreiben. Dies liegt daran, dass ich es gelöscht database.ymlund durch Verbindungsdetails für MongoDB ersetzt habe, um diesen Kern für die Verwendung von database.yml für MongoDB-Verbindungsdetails zu verwenden. Ich bin mir nicht sicher, warum es überhaupt in der Lage sein muss, eine DB-Verbindung herzustellen, um trotzdem einen Controller zu generieren.

Ist jemandem bekannt, wie Rails 3 dies richtig macht?

Mark Embling
quelle

Antworten:

155

Ich gehe davon aus, die Quelle zu lesen, also lass es mich wissen, wenn es tatsächlich funktioniert hat. :) :)

Der railsBefehl, der die Anwendungsvorlage generiert, verfügt jetzt über eine Option -O, mit der er angewiesen wird, ActiveRecord zu überspringen.

Wenn Sie keine erneute Ausführung wünschen rails, sollten Sie in Ihrer vorhandenen App Folgendes überprüfen:

  • Überprüfen Sie, ob Sie config/application.rb nicht haben require 'rails/all'oder require "active_record/railtie". Stattdessen sollte für ein Standard-Rails-Setup ohne ActiveRecord nur Folgendes erforderlich sein:

    require File.expand_path('../boot', __FILE__)
    
    require "action_controller/railtie"
    require "action_mailer/railtie"
    require "active_resource/railtie"
    require "rails/test_unit/railtie"
    require "sprockets/railtie"
    
    # Auto-require default libraries and those for the current Rails environment. 
    Bundler.require :default, Rails.env
  • Wenn config/application.rbSie in den config.generatorsAbschnitt verwenden, stellen Sie sicher, dass er keine Zeile enthält g.orm :active_record. Sie können dies explizit auf festlegen nil, wenn Sie möchten. Dies sollte jedoch die Standardeinstellung sein, wenn dies g.ormvollständig weggelassen wird.

  • Optional, aber in Ihrem Gemfileentfernen Sie die gemZeile, die das Modul für Ihre Datenbank lädt. Dies könnte gem "mysql"zum Beispiel die Linie sein .

Stéphan Kochen
quelle
3
Ja, das scheint es getan zu haben. Es scheint, dass die Option -O auch als '--skip-activerecord' aufgerufen werden kann. Ich habe den Befehl "Rails" für eine andere (temporäre) App mit dieser Option ausgeführt und eine neue App-Vorlage generiert, die genau Ihren Anforderungen entspricht. Ich konnte diese Änderungen also einfach kopieren und in meine eigentliche App einfügen. Danke - schöne Entdeckung :)
Mark Embling
1
Hervorragend - danke für die --skip-activerecord. Das ist genau das, was ich brauchte.
Finglas
Das funktioniert größtenteils, außer wenn ich Rails generiere - ich sehe dort immer noch ActiveRecord-Zeug - wie entferne ich es?
Hackeron
8
In Rails 3.1 müssen Sie auch require "sprockets/railtie"in Ihrer application.rbDatei haben.
Erskingardner
1
Nur um dieser Antwort und meinem vorherigen Kommentar ein kurzes Update hinzuzufügen ... in Rails 3.1 ist es jetzt --skip-active-record. Beachten Sie den zusätzlichen Strich.
Mark Embling
46

Schienen 4

Ich habe nach einer Möglichkeit zum Deaktivieren in Schienen 4 gesucht und nur diese Antwort gefunden, die in Schienen 4 nicht mehr funktioniert. So können Sie dies in Schienen 4 tun (getestet in RC1).

In einem neuen Projekt

rails new YourProject --skip-active-record

In einem bestehenden Projekt

  • Entfernen Sie in Ihrer Gemfile das Datenbanktreiber-Gem, z . B. gem 'sqlite3'oder gem 'pg'.
  • In config / application.rb, ersetzen require 'rails/all'mit

    erfordern "action_controller / railtie"
    erfordern "action_mailer / railtie"
    erfordern "Kettenräder / Schienen"
    erfordern "Rails / Test_unit / Railtie"
    

  • Entfernen oder kommentieren Sie in config / environment / development.rb config.active_record.migration_error = :page_load

  • Möglicherweise müssen Sie die Helfer von active_record aus dem spec_helper entfernen (über VenoM in den Kommentaren).

  • Möglicherweise müssen Sie die ConnectionManagement-Middleware entfernen (scheint bei Einhörnern der Fall zu sein): config.app_middleware.delete "ActiveRecord::ConnectionAdapters::ConnectionManagement"(über https://stackoverflow.com/a/18087332/764342 )

Ich hoffe, dies hilft anderen bei der Suche nach einer Deaktivierung von ActiveRecord in Rails 4.

Apeiros
quelle
3
Vielen Dank! Sie müssen jedoch die Hilfsprogramme für active_record aus dem spec_helper entfernen (nicht obligatorisch, aber wenn Sie Spezifikationen ausführen). Siehe letzten Kommentar von Rimian.
VenoM
Hat mir geholfen, danke! Gemäß den Kommentaren unten können andere Konfigurationsdeklarationen in den Dateien application.rb und / oder Umgebungen / {env} .rb auskommentiert werden. YMMV.
Nathan Smith
Die Aktivaufzeichnung bleibt immer noch in der gemfile.lock ... Können wir etwas dagegen tun?
Boti
@Boti Unwahrscheinlich. Es ist Teil der Schienen. Um es aus Ihrem .lock zu entfernen, müssten Sie vermutlich die Abhängigkeit von Schienen entfernen und von allen einzelnen Komponenten abhängen. In der Gemspec finden Sie eine Liste der Abhängigkeiten - Sie möchten von allem außer Activerecord abhängen. github.com/rails/rails/blob/master/rails.gemspec
John Hinnegan
Nach dieser Änderung scheint ein i18n-Problem aufgetreten zu sein: lib / active_support / i18n.rb: 13: in `<top (erforderlich)> ': nicht initialisierte Konstante I18n (NameError). Irgendwelche Ideen?
Michael Pell
36

Bei einer neuen Rails-App können Sie den aktiven Datensatz ausschließen, indem Sie den Parameter --skip-active-record angeben. Z.B:

rails new appname --skip-active-record
Jim Geurts
quelle
Ich habe dies getan und ein paar Unterschiede ausgeführt, um das Material in meiner aktuellen App zu finden und zu entfernen, das ActiveRecord verwendet
Keith Smiley
15

Wenn Sie mit Rails 3.2 ein neues Projekt erstellt haben, müssen Sie außerdem Folgendes auskommentieren:

config.active_record.mass_assignment_sanitizer = :strict

und

config.active_record.auto_explain_threshold_in_seconds = 0.5

in Ihrer Datei development.rb .

vlad
quelle
6

Alle oben genannten sind wahr. Das einzige, was ich in Rails 3.1 noch tun musste, ist das Auskommentieren

config.active_record.identity_map = true

in config/application.rb.

Michal Kuklis
quelle
2

Wenn Sie rspec ausführen, müssen Sie auch entfernen (in spec_helper):

  # Remove this line if you're not using ActiveRecord or ActiveRecord fixtures
  config.fixture_path = "#{::Rails.root}/spec/fixtures"

und entfernen

  # If you're not using ActiveRecord, or you'd prefer not to run each of your
  # examples within a transaction, remove the following line or assign false
  # instead of true.
  config.use_transactional_fixtures = true
Rimian
quelle
1

Auch Kommentar aus

# config/application.rb    
config.active_record.whitelist_attributes = true

(auf Schienen 3.2.13 vermerkt)

Andrew Lank
quelle