Eliminar ActiveRecord en Rails 3

99

Ahora que Rails 3 beta está disponible, pensé en reescribir una aplicación en la que acabo de empezar a trabajar en Rails 3 beta, tanto para familiarizarme con ella como para tener un poco de ventaja. La aplicación usa MongoDB y MongoMapper para todos sus modelos y, por lo tanto, no necesita ActiveRecord. En la versión anterior, estoy descargando activerecord de la siguiente manera:

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

En la última versión, esto no funciona, solo arroja un error:

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

Por supuesto, he mirado el boot.rb como sugirió, pero por lo que puedo ver, no hay ninguna pista aquí sobre cómo podría hacer para descargar AR. La razón por la que necesito hacer esto es porque no solo es una tontería cargar algo que no quiero, sino que también se queja de su incapacidad para hacer una conexión DB incluso cuando intento ejecutar un generador para un controlador. Esto se debe a que lo borré database.ymly lo reemplacé con detalles de conexión para MongoDB para poder usar esta esencia para usar database.yml para los detalles de conexión de MongoDB. No estoy seguro de por qué necesita poder iniciar una conexión de base de datos solo para generar un controlador de todos modos ...

¿Alguien conoce la forma correcta de Rails 3 para hacer esto?

Mark Embling
fuente

Respuestas:

155

Me baso en esto al leer la fuente, así que avíseme si realmente funcionó. :)

El railscomando que genera la plantilla de la aplicación ahora tiene una opción -Oque le indica que omita ActiveRecord.

Si no tiene ganas de volver a ejecutar rails, debe verificar lo siguiente en su aplicación existente:

  • Compruebe que config/application.rb no tenga require 'rails/all'o require "active_record/railtie". En cambio, para una configuración estándar de Rails sin ActiveRecord, debería tener solo los siguientes requisitos:

    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
  • Si, en config/application.rb, está utilizando la config.generatorssección, asegúrese de que no tenga la línea g.orm :active_record. Puede establecer esto explícitamente en nil, si lo desea, pero debe ser el valor predeterminado cuando g.ormse omite por completo.

  • Opcional, pero en su Gemfile, elimine la gemlínea que carga el módulo para su base de datos. Esta podría ser la línea, gem "mysql"por ejemplo.

Stéphan Kochen
fuente
3
Sí, eso parece haberlo hecho. Parece que la opción -O también se puede invocar como '--skip-activerecord'. Ejecuté el comando rails para otra aplicación (temporal) con esta opción y generó una nueva plantilla de aplicación que coincide exactamente con lo que ha escrito anteriormente. Entonces podría simplemente copiar y pegar estos cambios en mi aplicación real. Gracias - buen hallazgo :)
Mark Embling
1
Excelente, gracias por --skip-activerecord. Eso es justo lo que necesitaba.
Finglas
Eso funciona en su mayor parte, excepto cuando ejecuto la generación de rieles, todavía veo cosas de ActiveRecord allí, ¿cómo lo elimino?
Hackeron
8
En rails 3.1 también necesitas tener require "sprockets/railtie"en tu application.rbarchivo.
erskingardner
1
Solo para agregar una actualización rápida a esta respuesta y mi comentario anterior ... en Rails 3.1, es ahora --skip-active-record. Observe el guión adicional.
Mark Embling
46

Carriles 4

Estaba buscando cómo deshabilitarlo en los carriles 4 y solo encontré esta respuesta que ya no funciona en los carriles 4. Así es como puedes hacerlo en los carriles 4 (probado en RC1).

En un nuevo proyecto

rails new YourProject --skip-active-record

En un proyecto existente

  • En su Gemfile, elimine la gema del controlador de la base de datos, por ejemplo, gem 'sqlite3'o gem 'pg'.
  • En config / application.rb, reemplace require 'rails/all'con

    requiere "action_controller / railtie"
    requiere "action_mailer / railtie"
    requieren "piñones / railtie"
    requieren "rails / test_unit / railtie"
    

  • En config / environment / development.rb, elimine o comente config.active_record.migration_error = :page_load

  • Potencialmente, debe eliminar los ayudantes active_record de spec_helper (a través de VenoM en los comentarios)

  • Potencialmente, debe eliminar el middleware ConnectionManagement (parece ser el caso de unicornio): config.app_middleware.delete "ActiveRecord::ConnectionAdapters::ConnectionManagement"(a través de https://stackoverflow.com/a/18087332/764342 )

Espero que esto ayude a otros a buscar cómo deshabilitar ActiveRecord en Rails 4.

apeiros
fuente
3
¡Gracias! Aún así, debe eliminar los ayudantes active_record de spec_helper (no es obligatorio, pero si está ejecutando especificaciones). Ver el último comentario de Rimian.
VenoM
¡Me ayudó, gracias! Según los comentarios a continuación, puede haber otras declaraciones de configuración para comentar en los archivos application.rb y / o entornos / {env} .rb. YMMV.
Nathan Smith
el activerecord todavía permanece en el gemfile.lock ... ¿Podemos hacer algo contra él?
Boti
@Boti Improbable. Es parte de los rieles. Para eliminarlo de su .lock, imagino que tendría que eliminar la dependencia de los rieles y depender de todos los componentes individuales. Consulte gemspec para ver la lista de dependencias; querrá depender de todo menos activerecord. github.com/rails/rails/blob/master/rails.gemspec
John Hinnegan
Parece que me estoy encontrando con un problema relacionado con i18n después de realizar este cambio: lib / active_support / i18n.rb: 13: in `<top (required)> ': constante no inicializada I18n (NameError). ¿Algunas ideas?
Michael Pell
36

Para una nueva aplicación de rieles, puede hacer que excluya el registro activo especificando el parámetro --skip-active-record. P.ej:

rails new appname --skip-active-record
Jim Geurts
fuente
Hice esto y ejecuté algunas diferencias para encontrar y eliminar las cosas en mi aplicación actual que usaban ActiveRecord
Keith Smiley
15

Si generó un nuevo proyecto usando Rails 3.2, también deberá comentar:

config.active_record.mass_assignment_sanitizer = :strict

y

config.active_record.auto_explain_threshold_in_seconds = 0.5

en su archivo development.rb .

vlad
fuente
6

Todo lo mencionado es cierto. La única cosa que tuve que hacer en rails 3.1 es comentar

config.active_record.identity_map = true

en config/application.rb.

Michal Kuklis
fuente
2

Si está ejecutando rspec, también debe eliminar (en spec_helper):

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

y quitar

  # 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
Rimiano
fuente
1

También comentar a cabo

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

(anotado en los rieles 3.2.13)

Andrew Lank
fuente