禁用 Rails 4 的 ActiveRecord

Posted

技术标签:

【中文标题】禁用 Rails 4 的 ActiveRecord【英文标题】:Disable ActiveRecord for Rails 4 【发布时间】:2013-10-05 08:40:32 【问题描述】:

我想在 Rails 4 中禁用 ActiveRecord。我在 config/application.rb 中做了以下操作

require File.expand_path('../boot', __FILE__)

# require 'rails/all'  -- commented

require "action_controller/railtie"
require "action_mailer/railtie"
#require "active_resource/railtie" no need
#require "rails/test_unit/railtie" no need
#require "sprockets/railtie" no need

# Require the gems listed in Gemfile, including any gems
# you've limited to :test, :development, or :production.
Bundler.require(:default, Rails.env)

module MyApp
  class Application < Rails::Application
     config.app_middleware.delete "ActiveRecord::ConnectionAdapters::ConnectionManagement"
  end
end

我有一个错误

/home/alex/.rvm/gems/ruby-2.0.0-p247/gems/railties-4.0.0/lib/rails/railtie/configuration.rb:95:in 
  method_missing: undefined method active_record for #<Rails::Application::Configuration:0x00000002005c38> (NoMethodError)

【问题讨论】:

为什么不直接使用rails new ... -O 来禁用activerecord? 是否需要 app_middleware.delete,甚至可能导致问题? 对于现有的 rails 4/5/6 应用程序,您可以禁用活动记录 following this answer。 【参考方案1】:

如果您正在创建一个新应用程序,您可以使用-O 跳过 ActiveRecord:

rails new my_app -O

对于现有应用程序:

1.从您的 Gemfile 中删除数据库适配器 gem(mysql2、sqlite3 等)

2。更改您的config/application.rb

删除require 'rails/all 行并要求您要使用的框架(在您的rails 版本中的available 中,列表各不相同,不要只是复制),例如:

require "action_controller/railtie"
require "action_mailer/railtie"
require "sprockets/railtie"
require "rails/test_unit/railtie"

config/application.rb 中删除config.active_record.raise_in_transactional_callbacks = true

3.删除您的 config/database.yml 文件、db/schema.rb 和迁移(如果有)

4.删除test/test_helper.rb中的迁移检查

5.从您的 config/environments 文件中删除任何 ActiveRecord 配置(这是导致您的错误的原因)

对于一个空的 Rails 应用程序,这就是您需要做的所有事情。如果您遇到由现有代码引起的问题,堆栈跟踪应该为您提供有关需要更改的足够信息。例如,您的初始化程序中可能有一些 ActiveRecord 配置。

【讨论】:

除了这些更改之外,我还必须从 spec_helpers.rb 中删除几行(使用 RSpec):关于固定装置和事务。我也在使用 active_model,所以我在需求列表中用 active_model 替换了 active_record:***.com/questions/19078044/… 在哪里可以看到可用 Rails 框架的列表,以代替“rails/all”? require 'rails/all' 包含的所有内容的列表可以在here 找到。 一个月前我用rails new my_app -O 创建了一个应用程序。现在我想要活动记录。我现在需要添加哪些文件/宝石/配置? 我还必须从 config/application.rb 中删除 config.active_record.raise_in_transactional_callbacks = true【参考方案2】:

适用于带有 spec/dummy 应用的 Rails 插件(或 gem)

当您的 Rails 应用程序位于 spec/dummy 并且您从插件根目录启动服务器时。您可能仍然会收到以下错误:

Cannot load `Rails.application.database_configuration`: Could not load database configuration. No such file - ["config/database.yml"] 

为避免这种情况,请删除文件bin/rails 中的require rails/all 并要求您要使用的框架,例如:

# Pick the frameworks you want: 
require "active_model/railtie" 
require "active_job/railtie"
# require "active_record/railtie" 
require "action_cable/engine"
require "action_controller/railtie" 
require "action_mailer/railtie" 
require "action_view/railtie" 
require "sprockets/railtie" 
require "rails/test_unit/railtie"

【讨论】:

【参考方案3】:

对于 Ruby On Rails 5.1.x 版

require "rails"
# Pick the frameworks you want:
require "active_model/railtie"
require "active_job/railtie"
# require "active_record/railtie"
require "action_controller/railtie"
require "action_mailer/railtie"
require "action_view/railtie"
require "action_cable/engine"
require "sprockets/railtie"
require "rails/test_unit/railtie"

【讨论】:

【参考方案4】:

对于 Rails 5:

如果您正在生成新应用

使用--skip-active-record 选项生成没有数据库的应用程序:

rails new myApp --skip-active-record

请注意额外的连字符“-”,而不是以前版本的 Rails。

【讨论】:

如果您已经创建了项目而没有跳过活动记录,只需在 config/environments/ 中注释所有 active_record 引用 # config.active_record.verbose_query_logs = true # config.active_record.migration_error = :page_load 并重命名你的 database.yml 文件到别的东西。那是为我做的。 也在 bin/setup => # system! 'bin/rails db:setup'【参考方案5】:

由于这仍然是谷歌搜索禁用 Rails 5 的活动记录时的第一个命中,我将在此处添加:

适用于 Rails 5

执行@mechanicalfish 回答中的所有步骤,但也要删除该行

Rails.application.config.active_record.belongs_to_required_by_default = true

来自

config/initializers/new_framework_defaults.rb

【讨论】:

【参考方案6】:

嗨,这是默认的 rails new_app -O 提供的

require "rails"
# Pick the frameworks you want: 
require "active_model/railtie" 
require "active_job/railtie"
# require "active_record/railtie" 
require "action_controller/railtie" 
require "action_mailer/railtie" 
require "action_view/railtie" 
require "sprockets/railtie" 
require "rails/test_unit/railtie"

在您的 config/application.rb

此外,它没有 database.yml 并且没有 db/migrate/*schema.rb

【讨论】:

对于 rails 5 require "action_cable/engine"【参考方案7】:

要在 Rails 4.2 中禁用 ActiveRecord,您可以创建 config/initializers/middleware.rb

Rails.application.middleware.tap do |middleware|
  middleware.delete ActiveRecord::Migration::CheckPending
  middleware.delete ActiveRecord::ConnectionAdapters::ConnectionManagement
  middleware.delete ActiveRecord::QueryCache
end

查看终端rake中间件

【讨论】:

【参考方案8】:

对于那些使用rails-api gem 的人,在执行rails-api new my_api 时使用--skip-active-record 标志可能会遇到类似的错误。当前的修复(直到发布新的更正版 gem)是编辑您的 rails-api gem 以拥有this commit。使用bundle open 并用新的更正后的Gemfile 替换旧的Gemfile。重新运行,你应该已经准备好了。

【讨论】:

以上是关于禁用 Rails 4 的 ActiveRecord的主要内容,如果未能解决你的问题,请参考以下文章

如何禁用某个列的 ActiveRecord 日志记录?

Rails 4,ActiveRecord,查找当前用户未评论的所有帖子

Rails 6.1.4 中的 ActiveRecord 枚举行为更改

Rails 4 ActiveRecord 有很多通过关系不能从 sql 文件读取

如何向 Rails 4 中的所有 ActiveRecord 模型添加 `audited` 方法调用?

Rails 4 - 生产资产:预编译导致 ActiveRecord::NoDatabaseError: FATAL: database does not exist