未初始化的常量ActiveRecord :: ConnectionAdapters :: Mysql2Adapter :: NATIVE_DATABASE_TYPES(NameError)

Joh*_*rte 7 ruby activerecord ruby-on-rails ruby-on-rails-3

我遇到运行我的rails服务器的问题.我在初始化程序中设置了abstract_mysql2_adapters,包括:

class ActiveRecord::ConnectionAdapters::Mysql2Adapter
NATIVE_DATABASE_TYPES[:primary_key] = "int(11) auto_increment PRIMARY KEY"
end
Run Code Online (Sandbox Code Playgroud)

它解决了我的rake db:migrate问题,但是当我尝试运行我的rails服务器时,它给了我这个错误.

C:/Users/XXXX/Documents/RoRCmS/simple_cms/config/initializers/abstract_mysql2_adapter.rb:2 <class:Mysql2Adapter>': uninitialized constant ActiveRecord::ConnectionAda pters::Mysql2Adapter::NATIVE_DATABASE_TYPES (NameError) from C:/Users/John/Documents/RoRCmS/simple_cms/config/initializers/abstract_mysql2_adapter.rb:1:in:in'from C:/Ruby23-x64/lib/ruby/gems/2.3.0/gems/railties-4.0.0 /lib/rails/engine.rb:609:block (2 levels) in <class:Engine>' from C:/Ruby23-x64/lib/ruby/gems/2.3.0/gems/railties-4.0.0/lib/rails/engine.rb:608:in每个'来自C:/Ruby23-x64/lib/ruby/gems/2.3.0/gems/railties-4.0.0/lib/rails/engine.rb:608: in block in <class:Engine>' from C:/Ruby23-x64/lib/ruby/gems/2.3.0/gems/railties-4.0.0/lib/rails/initializable.rb:30:ininstance_exec'from C:/Ruby23-x64/lib/ruby/gems/2.3.0/gems/railties-4.0.0/lib/rails/initializable.rb:30:in run' from C:/Ruby23-x64/lib/ruby/gems/2.3.0/gems/railties-4.0.0/lib/rails/initializable.rb:55:inblock in run_initializers'from C:/ Ruby23- x64/lib/ruby​​/2.3.0/tsort.rb:228:block in tsort_each' from C:/Ruby23-x64/lib/ruby/2.3.0/tsort.rb:350:in来自C:/Ruby23-x64/lib/ruby/2.3.0/tsort.rb的每个_trongly_connected_component' 中的块(2个级别):431:in each_strongly_connected_component_from' from C:/Ruby23-x64/lib/ruby/2.3.0/tsort.rb:349:inblock in来自C:/Ruby23-x64/lib/ruby/2.3.0/tsort.rb:344:each' from C:/Ruby23-x64/lib/ruby/2.3.0/tsort.rb:347:in来自C:/Ruby23-x64/lib/ruby/2.3.0/tsort.rb的调用':347:in each_strongly_connected_component' from C:/Ruby23-x64/lib/ruby/2.3.0/tsort.rb:226:in来自C的tsort_each':/ Ruby23-x64/lib/ruby/2.3.0/tsort.rb:205:tsort_each' from C:/Ruby23-x64/lib/ruby/gems/2.3.0/gems/railties-4.0.0/lib/rails/initializable.rb:54:in来自C:/Ruby23-x64/lib/ruby/gems/2.3.0/gems/railties-4.0的run_initializers' .0/lib/rails/application.rb:215:在initialize!' from C:/Ruby23-x64/lib/ruby/gems/2.3.0/gems/railties-4.0.0/lib/rails/railtie/configurable.rb:30:inC语言的method_missing'中:/Users/John/Documents/RoRCmS/simple_cms/config/environment.rb:5:in require'from <top (required)>' from C:/Users/John/Documents/RoRCmS/simple_cms/config.ru:3:inC:/ Users/Joh n/Documents/RoRCmS/simple_cms/config.ru:3:in block in <main>' from C:/Ruby23-x64/lib/ruby/gems/2.3.0/gems/rack-1.5.5/lib/rack/builder.rb:55:ininstance_eval'from C:/Ruby23-x64/lib/ruby/gems/2.3.0/gems/rack-1.5.5/lib/rack/builder.rb :55:在initialize' from C:/Users/John/Documents/RoRCmS/simple_cms/config.ru:in新的'来自C:/Users/John/Documents/RoRCmS/simple_cms/config.ru:in <main>' from C:/Ruby23-x64/lib/ruby/gems/2.3.0/gems/rack-1.5.5/lib/rack/builder.rb:49:ineval'来自C:/Ruby23-x64/lib/ruby/gems/2.3.0/gems/rack-1.5 .5/lib/rack/builder.rb:49:new_from_string' from C:/Ruby23-x64/lib/ruby/gems/2.3.0/gems/rack-1.5.5/lib/rack/builder.rb:40:in来自C:/Ruby23-x64/lib/ruby/gems/2.3.0/gems/rack-1.5.5/lib/rack/server.rb的parse_file': 277:在build_app_and_options_from_config' from C:/Ruby23-x64/lib/ruby/gems/2.3.0/gems/rack-1.5.5/lib/rack/server.rb:199:in应用程序中来自C:/Ruby23-x64/lib/ruby/gems/2.3.0/gems/railties-4.0.0/lib/rails/commands/server.rb:48:in app' from C:/Ruby23-x64/lib/ruby/gems/2.3.0/gems/rack-1.5.5/lib/rack/server.rb:314:inwrapped_app'来自C:/ Ruby23-x64/lib/ruby​​/gems/2.3.0/gems/railties-4.0.0/lib/rails/commands/server.rb:75:start' from C:/Ruby23-x64/lib/ruby/gems/2.3.0/gems/railties-4.0.0/lib/rails/commands.rb:78:in在'from C:/ Ruby23-x64/lib/ruby​​ /中的块中gems/2.3.0/gems/railties-4.0.0/lib/rails/commands.rb:73:in tap' from C:/Ruby23-x64/lib/ruby/gems/2.3.0/gems/railties-4.0.0/lib/rails/commands.rb:73:in"from bin/rails:4:in require' from bin/rails:4:in'

我现在真的需要解决这个问题..谢谢你们.

Luk*_*oen 6

我解决了它如下.在将遗留的sql dumpfile导入MySQL后mysql -u username -p database_name < file.sql,我继续执行迁移bin/rake db:migrate,但是我遇到了错误Mysql2::Error: All parts of a PRIMARY KEY must be NOT NULL; if you need NULL in a key, use UNIQUE instead.

所以我尝试了和你一样的猴子补丁,正如用户pjg所建议的那样https://github.com/rails/rails/pull/13247#issuecomment-32425844,但后来我遇到了你的错误

uninitialized constant ActiveRecord::ConnectionAdapters::Mysql2Adapter::NATIVE_DATABASE_TYPES (NameError)
Run Code Online (Sandbox Code Playgroud)

我跟着用户John Geliberte的建议并更新了我的Gemfile,gem 'activerecord-native_db_types_override'并检查了我还有gem 'mysql2'(NOT'activerecord -mysql2-adapter'导致其他错误)并运行bundle install.

我使用了与activerecord-native_db_types_override gem关联的文档,并为Rails ActiveRecord库文件中提到的NATIVE_DATABASE_TYPES应用了属性abstract_mysql_adapter,这样我做了以下更改:

我创建了config/initializers/abstract_mysql2_adapter.rb并添加了:

require 'active_record/connection_adapters/mysql2_adapter'
NativeDbTypesOverride.configure({
  ActiveRecord::ConnectionAdapters::Mysql2Adapter => {
    primary_key: "int(11) auto_increment PRIMARY KEY"
  }
})
Run Code Online (Sandbox Code Playgroud)

我创建了config/environment.rb并添加以下内容来加载猴子补丁:

require File.expand_path('../initializers/abstract_mysql2_adapter.rb', __FILE__)
Run Code Online (Sandbox Code Playgroud)

我检查了config/database.yml是否包含'adapter:mysql2',用于我想要使用的数据库连接.

然后我跑了bin/rake db:migrate,它成功完成了迁移.

我已经向ActiveRecord Native Database Types Override Gem的文档提出了拉取请求.

尽管如此,从MySQL 5.7降级到5.5要容易得多.

我的系统:

  • mysql -Vmysql Ver 14.14 Distrib 5.7.13
  • rails -v4.2.4
  • ruby -vruby 2.3.0p0


Joh*_*rte 5

解决:我添加了gem:gem'activerecord-native_db_types_override'


Emi*_*asa -1

试试这个代码:

class ActiveRecord::ConnectionAdapters::Mysql2Adapter
  def modify_types(types)
    super
    types[:primary_key] = "int(11) auto_increment PRIMARY KEY"
    types
  end
end
Run Code Online (Sandbox Code Playgroud)