在Rails 3中删除ActiveRecord


99

现在,Rails 3 beta已经发布了,我想我应该看看重写一下我刚刚开始在Rails 3 beta中工作的应用程序,既可以体会到它,又可以有所作为。该应用程序将MongoDB和MongoMapper用于其所有模型,因此不需要ActiveRecord。在以前的版本中,我通过以下方式卸载activerecord:

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

在最新版本中,此方法无效-只会引发错误:

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

当然,我已经按照建议的方式查看了boot.rb,但是据我所知,这里没有任何关于如何卸载AR的线索。我需要执行此操作的原因是,不仅加载不需要的内容很愚蠢,而且即使我尝试为控制器运行生成器,也抱怨无法建立数据库连接。这是因为我已经擦除database.yml了MongoDB的连接详细信息并将其替换为连接详细信息,以便将此要点用于将database.yml用于MongoDB的连接详细信息。不知道为什么它只需要能够启动数据库连接就可以生成一个控制器...。

有谁知道正确的Rails 3方法吗?

Answers:


155

我通过阅读源代码来解决这个问题,所以让我知道它是否确实有效。:)

现在rails,生成应用程序模板的命令具有一个option -O,告诉它跳过ActiveRecord。

如果您不想重新运行rails,则应在现有应用中检查以下内容:

  • 检查您config/application.rb 具有require 'rails/all'require "active_record/railtie"。相反,对于没有ActiveRecord的标准Rails设置,它应该满足以下要求:

    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
  • 如果在config/application.rb中使用config.generators节,请确保其中没有line g.orm :active_record。您可以根据需要将其显式设置为nil,但是在g.orm完全省略时应将其设置为默认值。

  • 可选,但在您的中Gemfile,删除gem为数据库加载模块的行。gem "mysql"例如,这可能是一行。


3
是的,似乎已经做到了。看来-O选项也可以作为'--skip-activerecord'来调用。我使用此选项为另一个(临时)应用程序运行了rails命令,它生成了一个与您上面编写的内容完全匹配的新应用程序模板。因此,我可以将这些更改复制并粘贴到我的实际应用中。谢谢-非常好:)
Mark Embling,2010年

1
太好了-感谢--skip-activerecord。那正是我所需要的。
Finglas 2010年

这在大多数情况下都是有效的,除了运行rails generate时-我仍然在其中看到ActiveRecord的内容-如何将其删除?
Hackeron 2011年

8
在rails 3.1中,您还需要require "sprockets/railtie"application.rb文件中包含该文件。
erskingardner 2011年

1
只是为了在此答案和我之前的评论中添加快速更新...在Rails 3.1中,现在是--skip-active-record。注意额外的破折号。
Mark Embling

46

滑轨4

我一直在寻找如何在Rails 4中禁用它的方法,仅找到不再在Rails 4中起作用的答案。因此,这就是在Rails 4中进行测试的方法(在RC1中进行了测试)。

在一个新项目中

rails new YourProject --skip-active-record

在现有项目中

  • 在您的Gemfile中,删除数据库驱动程序gem,例如gem 'sqlite3'gem 'pg'
  • 在config / application.rb中,替换require 'rails/all'

    需要“ action_controller / railtie”
    需要“ action_mailer / railtie”
    需要“链轮/滚轮”
    需要“ rails / test_unit / railtie”
    

  • 在config / environments / development.rb中,删除或注释掉 config.active_record.migration_error = :page_load

  • 可能您必须从spec_helper中删除active_record帮助器(通过注释中的VenoM)

  • 潜在地,您必须删除ConnectionManagement中间件(似乎是独角兽):(config.app_middleware.delete "ActiveRecord::ConnectionAdapters::ConnectionManagement"通过https://stackoverflow.com/a/18087332/764342

我希望这可以帮助其他人寻找如何在Rails 4中禁用ActiveRecord。


3
谢谢!仍然需要从spec_helper中删除active_record帮助器(不是强制性的,但是如果您正在运行spec)。请参阅Rimian的最新评论。
VenoM

帮助了我,谢谢!根据下面的注释,在application.rb和/或environment / {env} .rb文件中可能还有其他配置声明要注释掉。YMMV。
内森·史密斯

activerecord仍保留在gemfile.lock中...我们可以对此采取措施吗?
博蒂

@Boti不太可能。它是铁轨的一部分。要从您的.lock中删除它,我想您必须删除对rails的依赖,并依赖于所有单个组件。查看gemspec中的依赖项列表-您希望依赖除activerecord之外的所有内容。github.com/rails/rails/blob/master/rails.gemspec
John Hinnegan

进行此更改后,我似乎遇到了与i18n相关的问题:lib / active_support / i18n.rb:13:in`<top(必需)>':未初始化的常量I18n(NameError)。有任何想法吗?
Michael Pell 2014年

36

对于新的Rails应用程序,可以通过指定--skip-active-record参数来使其排除活动记录。例如:

rails new appname --skip-active-record

我这样做并进行了一些比较,以查找和删除当前使用ActiveRecord的应用程序中的内容
Keith Smiley 2013年

15

如果使用Rails 3.2生成了一个新项目,则还需要注释掉:

config.active_record.mass_assignment_sanitizer = :strict

config.active_record.auto_explain_threshold_in_seconds = 0.5

在您的development.rb文件中。



2

如果您正在运行rspec,则还需要删除(在spec_helper中):

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

并删除

  # 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

评论

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

(在导轨3.2.13上注明)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.