【问题标题】:Remove ActiveRecord in Rails 3在 Rails 3 中删除 ActiveRecord
【发布时间】:2010-02-06 09:51:45
【问题描述】:

现在 Rails 3 测试版已经发布,我想我应该看看在 Rails 3 测试版中重写一个我刚刚开始工作的应用程序,以感受它并获得一点先机.该应用程序的所有模型都使用 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 的连接详细信息,以便使用 this gist 将 database.yml 用于 MongoDB 连接详细信息。不知道为什么它需要能够启动数据库连接只是为了生成一个控制器......

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

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3


    【解决方案1】:

    我是通过阅读源代码来完成的,所以让我知道它是否真的有效。 :)

    生成应用程序模板的rails 命令现在有一个选项-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 部分,请确保它没有g.orm :active_record 行。如果需要,您可以将其显式设置为 nil,但当 g.orm 完全省略时,这应该是默认值。

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

    【讨论】:

    • 是的,似乎已经做到了。似乎 -O 选项也可以作为“--skip-activerecord”调用。我使用此选项为另一个(临时)应用程序运行 rails 命令,它生成了一个与您在上面编写的完全匹配的新应用程序模板。所以我可以将这些更改复制并粘贴到我的实际应用程序中。谢谢 - 很好的发现:)
    • 非常好 - 感谢 --skip-activerecord。这正是我所需要的。
    • 这在大多数情况下都有效,除非我运行 rails generate - 我仍然在那里看到 ActiveRecord 的东西 - 我该如何删除它?
    • 在 Rails 3.1 中,您还需要在 application.rb 文件中包含 require "sprockets/railtie"
    • 只是为了快速更新这个答案和我之前的评论......在 Rails 3.1 中,现在是--skip-active-record。注意额外的破折号。
    【解决方案2】:

    Rails 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 助手(通过 cmets 中的 VenoM)

    • 可能您必须删除 ConnectionManagement 中间件(似乎是独角兽的情况):config.app_middleware.delete "ActiveRecord::ConnectionAdapters::ConnectionManagement"(通过https://stackoverflow.com/a/18087332/764342

    我希望这有助于其他寻找如何在 Rails 4 中禁用 ActiveRecord 的人。

    【讨论】:

    • 谢谢!您仍然需要从 spec_helper 中删除 active_record 助手(不是强制性的,但如果您正在运行规范)。请参阅 Rimian 的最后评论。
    • 帮助了我,谢谢!根据下面的 cmets,在 application.rb 和/或 environment/{env}.rb 文件中可能有其他配置声明要注释掉。 YMMV。
    • activerecord 仍然保留在 gemfile.lock 中...我们可以对它做些什么吗?
    • @Boti 不太可能。它是铁轨的一部分。要从您的 .lock 中删除它,我想您必须删除对 rails 的依赖并依赖所有单个组件。查看 gemspec 以获取依赖项列表——您希望依赖除 activerecord 之外的所有内容。 github.com/rails/rails/blob/master/rails.gemspec
    • 进行此更改后,我似乎遇到了与 i18n 相关的问题:lib/active_support/i18n.rb:13:in `': uninitialized constant I18n (NameError)。有什么想法吗?
    【解决方案3】:

    对于新的 rails 应用,您可以通过指定 --skip-active-record 参数让它排除活动记录。例如:

    rails new appname --skip-active-record
    

    【讨论】:

    • 我这样做并运行了一些差异来查找并删除我当前使用 ActiveRecord 的应用程序中的内容
    【解决方案4】:

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

    config.active_record.mass_assignment_sanitizer = :strict
    

    config.active_record.auto_explain_threshold_in_seconds = 0.5
    

    在您的 development.rb 文件中。

    【讨论】:

      【解决方案5】:

      以上都是真的。我在 rails 3.1 中必须做的另一件事是注释掉

      config.active_record.identity_map = true
      

      config/application.rb.

      【讨论】:

        【解决方案6】:

        如果你正在运行 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
        

        【讨论】:

          【解决方案7】:

          评论

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

          (在 Rails 3.2.13 上注明)

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-01-13
            • 2013-09-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多