Rimuovere ActiveRecord in Rails 3


99

Ora che Rails 3 beta è uscito, ho pensato di dare un'occhiata alla riscrittura di un'app su cui ho appena iniziato a lavorare in Rails 3 beta, sia per avere un'idea che per ottenere un po 'di vantaggio. L'app utilizza MongoDB e MongoMapper per tutti i suoi modelli e quindi non ha bisogno di ActiveRecord. Nella versione precedente, sto scaricando activerecord nel modo seguente:

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

Nell'ultima versione questo non funziona - genera solo un errore:

/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*

Ovviamente, ho esaminato boot.rb come suggerito, ma per quanto posso vedere, non c'è alcun indizio su come posso scaricare AR. Il motivo per cui ho bisogno di farlo è perché non solo è sciocco caricare qualcosa che non voglio, ma si lamenta della sua incapacità di stabilire una connessione DB anche quando provo a eseguire un generatore per un controller. Questo perché l'ho cancellato database.ymle sostituito con i dettagli di connessione per MongoDB al fine di utilizzare questo gist per l'utilizzo di database.yml per i dettagli di connessione MongoDB. Non sono sicuro del motivo per cui deve essere in grado di avviare una connessione DB solo per generare comunque un controller ...

Qualcuno è a conoscenza del modo corretto di Rails 3 per farlo?

Risposte:


155

Sto leggendo la fonte, quindi fammi sapere se ha funzionato davvero. :)

Il railscomando che genera il modello dell'applicazione ora ha un'opzione -O, che gli dice di saltare ActiveRecord.

Se non hai voglia di rieseguire rails, dovresti controllare quanto segue nella tua app esistente:

  • Controlla che il tuo config/application.rb non abbia require 'rails/all'o require "active_record/railtie". Invece, per una configurazione Rails standard senza ActiveRecord, dovrebbe avere solo i seguenti requisiti:

    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
  • Se, in config/application.rb, stai usando la config.generatorssezione, assicurati che non abbia la linea g.orm :active_record. Puoi impostarlo esplicitamente su nil, se vuoi, ma dovrebbe essere l'impostazione predefinita quando g.ormviene completamente omesso.

  • Facoltativo, ma nel tuo Gemfile, rimuovi la gemriga che carica il modulo per il tuo database. Questa potrebbe essere la linea gem "mysql"per esempio.


3
Sì, sembra che l'abbia fatto. Sembra che l'opzione -O possa essere invocata anche come "--skip-activerecord". Ho eseguito il comando rails per un'altra app (temporanea) con questa opzione e ha generato un nuovo modello di app che corrisponde esattamente a quello che hai scritto sopra. Quindi potrei semplicemente copiare e incollare queste modifiche nella mia app attuale. Grazie - bella scoperta :)
Mark Embling

1
Eccellente - grazie per il --skip-activerecord. È proprio quello di cui avevo bisogno.
Finglas

Funziona per la maggior parte, tranne quando eseguo rails generate - vedo ancora cose di ActiveRecord lì - come lo rimuovo?
Hackeron

8
In rails 3.1 devi anche avere require "sprockets/railtie"nel tuo application.rbfile.
erskingardner

1
Solo per aggiungere un rapido aggiornamento a questa risposta e al mio commento precedente ... in Rails 3.1, è ora --skip-active-record. Notare il trattino in più.
Mark Embling

46

Rotaie 4

Stavo cercando come disabilitarlo in rails 4 e ho trovato solo questa risposta che non funziona più in rails 4. Quindi è così che puoi farlo in rails 4 (testato in RC1).

In un nuovo progetto

rails new YourProject --skip-active-record

In un progetto esistente

  • Nel tuo Gemfile, rimuovi il gem del driver del database, ad esempio gem 'sqlite3'o gem 'pg'.
  • In config / application.rb, sostituire require 'rails/all'con

    richiedono "action_controller / railtie"
    richiedono "action_mailer / railtie"
    richiedono "pignoni / railtie"
    richiedono "rails / test_unit / railtie"
    

  • In config / environment / development.rb, rimuovi o commenta config.active_record.migration_error = :page_load

  • Potenzialmente devi rimuovere gli helper active_record da spec_helper (tramite VenoM nei commenti)

  • Potenzialmente devi rimuovere il middleware ConnectionManagement (sembra essere il caso di unicorno): config.app_middleware.delete "ActiveRecord::ConnectionAdapters::ConnectionManagement"(tramite https://stackoverflow.com/a/18087332/764342 )

Spero che questo aiuti gli altri a cercare come disabilitare ActiveRecord in Rails 4.


3
Grazie! È comunque necessario rimuovere gli helper active_record da spec_helper (non obbligatorio, ma se stai eseguendo specs). Vedi l'ultimo commento di Rimian.
VenoM

Mi ha aiutato, grazie! Secondo i commenti di seguito, potrebbero esserci altre dichiarazioni di configurazione da commentare nei file application.rb e / o ambienti / {env} .rb. YMMV.
Nathan Smith

il activerecord rimane ancora nel gemfile.lock ... Possiamo fare qualcosa contro di esso?
Boti

@Boti Unlikely. Fa parte dei binari. Per rimuoverlo dal tuo .lock immagino che dovresti rimuovere la dipendenza dai binari e dipendere da tutti i singoli componenti. Controlla gemspec per l'elenco delle dipendenze: vorresti dipendere da tutto tranne activerecord. github.com/rails/rails/blob/master/rails.gemspec
John Hinnegan

Mi sembra di incorrere in un problema relativo a i18n dopo aver apportato questa modifica: lib / active_support / i18n.rb: 13: in `<top (richiesto)> ': costante non inizializzata I18n (NameError). Qualche idea?
Michael Pell

36

Per una nuova app rails, puoi fare in modo che escluda il record attivo specificando il parametro --skip-active-record. Per esempio:

rails new appname --skip-active-record

L'ho fatto e ho eseguito alcune differenze per trovare e rimuovere le cose nella mia attuale app che utilizzava ActiveRecord
Keith Smiley

15

Se hai generato un nuovo progetto usando Rails 3.2, dovrai anche commentare:

config.active_record.mass_assignment_sanitizer = :strict

e

config.active_record.auto_explain_threshold_in_seconds = 0.5

nel tuo file development.rb .


6

Tutto quanto sopra è vero. L'unica cosa che ho dovuto fare in rails 3.1 è commentare

config.active_record.identity_map = true

in config/application.rb.


2

Se stai utilizzando rspec, devi anche rimuovere (in spec_helper):

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

e rimuovi

  # 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

1

Anche commentare fuori

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

(annotato sui binari 3.2.13)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.