Supprimer ActiveRecord dans Rails 3

99

Maintenant que la version bêta de Rails 3 est sortie, j'ai pensé que j'allais jeter un coup d'œil à la réécriture d'une application sur laquelle je viens de commencer à travailler dans la version bêta de Rails 3, à la fois pour en avoir une idée et pour prendre une longueur d'avance. L'application utilise MongoDB et MongoMapper pour tous ses modèles et n'a donc pas besoin d'ActiveRecord. Dans la version précédente, je décharge activerecord de la manière suivante:

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

Dans la dernière version, cela ne fonctionne pas - cela génère simplement une erreur:

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

Bien sûr, j'ai regardé le boot.rb comme il le suggérait, mais pour autant que je sache, il n'y a aucune idée ici de la façon dont je pourrais procéder pour décharger AR. La raison pour laquelle je dois le faire est que non seulement il est ridicule de charger quelque chose que je ne veux pas, mais il se plaint de son incapacité à établir une connexion DB même lorsque j'essaye de faire fonctionner un générateur pour un contrôleur. C'est parce que je l'ai effacé database.ymlet remplacé par les détails de connexion pour MongoDB afin d'utiliser cette substance pour utiliser database.yml pour les détails de connexion MongoDB. Je ne sais pas pourquoi il doit pouvoir initier une connexion de base de données juste pour générer un contrôleur de toute façon ...

Quelqu'un est-il au courant de la bonne façon de procéder pour Rails 3?

Mark Embling
la source

Réponses:

155

Je me fie à cela en lisant la source, alors faites-moi savoir si cela a réellement fonctionné. :)

La railscommande qui génère le modèle d'application a maintenant une option -O, qui lui dit d'ignorer ActiveRecord.

Si vous n'avez pas envie de réexécuter rails, vous devez vérifier les éléments suivants dans votre application existante:

  • Assurez -vous que votre config/application.rb ne pas avoir require 'rails/all'ou require "active_record/railtie". Au lieu de cela, pour une configuration Rails standard sans ActiveRecord, il ne devrait avoir que les exigences suivantes:

    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, dans config/application.rb, vous utilisez la config.generatorssection, assurez-vous qu'elle n'a pas de ligne g.orm :active_record. Vous pouvez définir cela explicitement sur nil, si vous le souhaitez, mais cela devrait être la valeur par défaut lorsque g.ormest complètement omis.

  • Facultatif, mais dans votre Gemfile, supprimez la gemligne qui charge le module de votre base de données. Cela pourrait être la ligne gem "mysql"par exemple.

Stéphan Kochen
la source
3
Ouais, cela semble l'avoir fait. Il semble que l'option -O peut également être appelée comme «--skip-activerecord». J'ai exécuté la commande rails pour une autre application (temporaire) avec cette option et elle a généré un nouveau modèle d'application correspondant exactement à ce que vous avez écrit ci-dessus. Je pourrais donc simplement copier et coller ces modifications dans mon application réelle. Merci - belle trouvaille :)
Mark Embling
1
Excellent - merci pour le --skip-activerecord. C'est exactement ce dont j'avais besoin.
Finglas
Cela fonctionne pour la plupart, sauf lorsque je lance la génération de rails - je vois toujours des éléments ActiveRecord - comment puis-je le supprimer?
Hackeron
8
Dans les rails 3.1, vous devez également avoir require "sprockets/railtie"dans votre application.rbfichier.
erskingardner
1
Juste pour ajouter une mise à jour rapide à cette réponse et à mon commentaire précédent ... dans Rails 3.1, c'est maintenant --skip-active-record. Remarquez le tiret supplémentaire.
Mark Embling
46

Rails 4

Je cherchais comment le désactiver dans les rails 4 et je n'ai trouvé que cette réponse qui ne fonctionne plus dans les rails 4. C'est ainsi que vous pouvez le faire dans les rails 4 (testé en RC1).

Dans un nouveau projet

rails new YourProject --skip-active-record

Dans un projet existant

  • Dans votre Gemfile, supprimez le joyau du pilote de base de données, par exemple gem 'sqlite3'ou gem 'pg'.
  • Dans config / application.rb, remplacez require 'rails/all'par

    nécessite "action_controller / railtie"
    nécessite "action_mailer / railtie"
    nécessitent "pignons / railtie"
    nécessitent "rails / test_unit / railtie"
    

  • Dans config / environnements / development.rb, supprimez ou commentez config.active_record.migration_error = :page_load

  • Potentiellement, vous devez supprimer les helpers active_record de spec_helper (via VenoM dans les commentaires)

  • Vous devez potentiellement supprimer le middleware ConnectionManagement (cela semble être le cas avec unicorn): config.app_middleware.delete "ActiveRecord::ConnectionAdapters::ConnectionManagement"(via https://stackoverflow.com/a/18087332/764342 )

J'espère que cela aidera les autres à chercher comment désactiver ActiveRecord dans Rails 4.

Apeiros
la source
3
Merci! Vous devez quand même supprimer les helpers active_record de spec_helper (pas obligatoire, mais si vous exécutez des specs). Voir le dernier commentaire de Rimian.
VenoM
M'a aidé, merci! Selon les commentaires ci-dessous, il peut y avoir d'autres déclarations de configuration à commenter dans les fichiers application.rb et / ou environnements / {env} .rb. YMMV.
Nathan Smith
l'activerecord reste toujours dans le gemfile.lock ... Pouvons-nous faire quelque chose contre?
Boti
@Boti Improbable. Cela fait partie des rails. Pour le supprimer de votre .lock, j'imagine que vous devrez supprimer la dépendance aux rails et dépendre de tous les composants individuels. Consultez le gemspec pour la liste des dépendances - vous voudriez dépendre de tout sauf activerecord. github.com/rails/rails/blob/master/rails.gemspec
John Hinnegan
Il semble que je rencontre un problème lié à i18n après avoir effectué cette modification: lib / active_support / i18n.rb: 13: dans `<top (obligatoire)> ': constante non initialisée I18n (NameError). Des idées?
Michael Pell
36

Pour une nouvelle application de rails, vous pouvez lui demander d'exclure l'enregistrement actif en spécifiant le paramètre --skip-active-record. Par exemple:

rails new appname --skip-active-record
Jim Geurts
la source
Je l'ai fait et j'ai exécuté quelques différences pour trouver et supprimer les éléments de mon application actuelle qui utilisaient ActiveRecord
Keith Smiley
15

Si vous avez généré un nouveau projet à l'aide de Rails 3.2, vous devrez également commenter:

config.active_record.mass_assignment_sanitizer = :strict

et

config.active_record.auto_explain_threshold_in_seconds = 0.5

dans votre development.rb fichier.

Vlad
la source
6

Tout ce qui précède est vrai. La dernière chose que je devais faire dans les rails 3.1 est de commenter

config.active_record.identity_map = true

dans config/application.rb.

Michal Kuklis
la source
2

Si vous exécutez rspec, vous devez également supprimer (dans spec_helper):

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

et supprimer

  # 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
la source
1

Aussi commentaire sur

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

(noté sur les rails 3.2.13)

Andrew Lank
la source