Remover ActiveRecord no Rails 3

99

Agora que o Rails 3 beta foi lançado, pensei em reescrever um aplicativo no qual acabei de começar a trabalhar no Rails 3 beta, tanto para sentir como para começar. O aplicativo usa MongoDB e MongoMapper para todos os seus modelos e, portanto, não precisa do ActiveRecord. Na versão anterior, estou descarregando o registro ativo da seguinte maneira:

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

Na versão mais recente, isso não funciona - apenas gera um erro:

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

Claro, eu olhei para boot.rb conforme sugerido, mas até onde posso ver, não há nenhuma pista aqui de como eu poderia fazer para descarregar AR. O motivo pelo qual preciso fazer isso é porque não só é bobagem carregar algo que não quero, mas também porque ele está reclamando da impossibilidade de fazer uma conexão DB mesmo quando tento executar um gerador para um controlador. Isso ocorre porque eu limpei database.ymle substituí com detalhes de conexão para MongoDB a fim de usar esta essência para usar database.yml para detalhes de conexão MongoDB. Não sei por que precisa ser capaz de iniciar uma conexão de banco de dados apenas para gerar um controlador de qualquer maneira ....

Alguém está ciente da maneira correta do Rails 3 de fazer isso?

Mark Embling
fonte

Respostas:

155

Estou vendo isso depois de ler a fonte, então me diga se realmente funcionou. :)

O railscomando que gera o modelo de aplicativo agora tem uma opção -Oque o informa para pular o ActiveRecord.

Se você não deseja executar novamente rails, verifique o seguinte em seu aplicativo existente:

  • Verifique se o seu config/application.rb não tem require 'rails/all'ou require "active_record/railtie". Em vez disso, para uma configuração Rails padrão sem ActiveRecord, ele deve ter apenas os seguintes 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
  • Se, em config/application.rb, você estiver usando a config.generatorsseção, certifique-se de que ela não tenha a linha g.orm :active_record. Você pode definir isso explicitamente como nil, se quiser, mas esse deve ser o padrão quando g.ormfor completamente omitido.

  • Opcional, mas em seu Gemfile, remova a gemlinha que carrega o módulo para seu banco de dados. Esta poderia ser a linha, gem "mysql"por exemplo.

Stéphan Kochen
fonte
3
Sim, isso parece ter feito isso. Parece que a opção -O também pode ser chamada como '--skip-activerecord'. Eu executei o comando rails para outro aplicativo (temporário) com esta opção e gerou um novo modelo de aplicativo que corresponde exatamente ao que você escreveu acima. Então, eu poderia simplesmente copiar e colar essas alterações no meu aplicativo real. Obrigado - bom achado :)
Mark Embling
1
Excelente - obrigado pelo --skip-activerecord. Isso é exatamente o que eu precisava.
Finglas
Isso funciona na maior parte, exceto quando executo rails generate - ainda vejo coisas do ActiveRecord lá - como faço para removê-las?
Hackeron de
8
No rails 3.1 você também precisa ter require "sprockets/railtie"em seu application.rbarquivo.
erskingardner de
1
Só para adicionar uma atualização rápida para esta resposta e meu comentário anterior ... no Rails 3.1, é agora --skip-active-record. Observe o traço extra.
Mark Embling
46

Rails 4

Eu estava procurando como desabilitá-lo no rails 4 e só encontrei esta resposta que não funciona mais no rails 4. Então é assim que você pode fazer no rails 4 (testado no RC1).

Em um novo projeto

rails new YourProject --skip-active-record

Em um projeto existente

  • Em seu Gemfile, remova a gem do driver de banco de dados, por exemplo, gem 'sqlite3'ou gem 'pg'.
  • Em config / application.rb, substitua require 'rails/all'por

    requer "action_controller / railtie"
    requer "action_mailer / railtie"
    requer "rodas dentadas / trilhos"
    requer "rails / test_unit / railtie"
    

  • Em config / environment / development.rb, remova ou comente config.active_record.migration_error = :page_load

  • Potencialmente, você tem que remover os ajudantes active_record do spec_helper (via VenoM nos comentários)

  • Potencialmente, você terá que remover o middleware ConnectionManagement (parece ser o caso do unicórnio): config.app_middleware.delete "ActiveRecord::ConnectionAdapters::ConnectionManagement"(via https://stackoverflow.com/a/18087332/764342 )

Espero que isso ajude outras pessoas que procuram como desabilitar ActiveRecord no Rails 4.

apeiros
fonte
3
Obrigado! Ainda assim, você precisa remover os auxiliares active_record do spec_helper (não obrigatório, mas se você estiver executando especificações). Veja o último comentário de Rimian.
VenoM
Me ajudou, obrigado! De acordo com os comentários abaixo, pode haver outras declarações de configuração para comentar nos arquivos application.rb e / ou Environment / {env} .rb. YMMV.
Nathan Smith
o activerecord ainda permanece no gemfile.lock ... Podemos fazer algo contra ele?
Boti de
@Boti Improvável. Faz parte dos trilhos. Para removê-lo do seu .lock, imagino que você teria que remover a dependência de trilhos e depender de todos os componentes individuais. Verifique o gemspec para a lista de dependências - você gostaria de depender de tudo, menos do registro ativo. github.com/rails/rails/blob/master/rails.gemspec
John Hinnegan
Parece que estou tendo um problema relacionado ao i18n depois de fazer esta alteração: lib / active_support / i18n.rb: 13: in `<top (obrigatório)> ': constante não inicializada I18n (NameError). Alguma ideia?
Michael Pell
36

Para um novo aplicativo rails, você pode fazer com que ele exclua o registro ativo especificando o parâmetro --skip-active-record. Por exemplo:

rails new appname --skip-active-record
Jim Geurts
fonte
Fiz isso e executei alguns diffs para encontrar e remover as coisas em meu aplicativo atual que estava usando ActiveRecord
Keith Smiley
15

Se você gerou um novo projeto usando Rails 3.2, você também precisará comentar:

config.active_record.mass_assignment_sanitizer = :strict

e

config.active_record.auto_explain_threshold_in_seconds = 0.5

em seu arquivo development.rb .

vlad
fonte
6

Todas as opções acima são verdadeiras. A outra coisa que eu tive que fazer no rails 3.1 é comentar

config.active_record.identity_map = true

no config/application.rb.

Michal Kuklis
fonte
2

Se você estiver executando o rspec, você também precisa remover (em spec_helper):

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

e remover

  # 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
fonte
1

Também comentar para fora

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

(anotado nos trilhos 3.2.13)

Andrew Lank
fonte