undefined method `alias_method_chain' in activ

2019-09-19 03:34发布

问题:

This is my Rakefile

require 'bundler'
Bundler.setup
require 'active_record'
require 'sqlite3'
require 'yaml'
require 'logger'

task :migrate => :environment do
   ActiveRecord::Migrator.migrate('db/migrate', ENV["VERSION"] ? ENV["VERSION"].to_i : nil )
end

task :environment do
  ActiveRecord::Base.establish_connection(YAML::load(File.open('config/database.yaml'))['development'])
  ActiveRecord::Base.logger = Logger.new(STDOUT)
end

When I execute the task I got this error:

rake aborted!
/usr/local/rvm/gems/ruby-2.0.0-p0@ta/gems/activerecord-2.3.18/lib/active_record/base.rb:2449: warning: already initialized constant Class::VALID_FIND_OPTIONS
/usr/local/rvm/gems/ruby-2.0.0-p0@ta/gems/activerecord-2.3.18/lib/active_record/base.rb:2449: warning: previous definition of VALID_FIND_OPTIONS was here
undefined method `alias_method_chain' for #<Class:0x00000001606340>
/usr/local/rvm/gems/ruby-2.0.0-p0@ta/gems/activerecord-2.3.18/lib/active_record/base.rb:2002:in `method_missing'
/usr/local/rvm/gems/ruby-2.0.0-p0@ta/gems/activerecord-2.3.18/lib/active_record/validations.rb:387:in `block in included'
/usr/local/rvm/gems/ruby-2.0.0-p0@ta/gems/activerecord-2.3.18/lib/active_record/validations.rb:386:in `class_eval'
/usr/local/rvm/gems/ruby-2.0.0-p0@ta/gems/activerecord-2.3.18/lib/active_record/validations.rb:386:in `included'
/usr/local/rvm/gems/ruby-2.0.0-p0@ta/gems/activerecord-2.3.18/lib/active_record/base.rb:3210:in `include'
/usr/local/rvm/gems/ruby-2.0.0-p0@ta/gems/activerecord-2.3.18/lib/active_record/base.rb:3210:in `block in <module:ActiveRecord>'
/usr/local/rvm/gems/ruby-2.0.0-p0@ta/gems/activerecord-2.3.18/lib/active_record/base.rb:3208:in `class_eval'
/usr/local/rvm/gems/ruby-2.0.0-p0@ta/gems/activerecord-2.3.18/lib/active_record/base.rb:3208:in `<module:ActiveRecord>'
/usr/local/rvm/gems/ruby-2.0.0-p0@ta/gems/activerecord-2.3.18/lib/active_record/base.rb:5:in `<top (required)>'
/home/marco/desenv/technical_analysis/Rakefile:14:in `block in <top (required)>'
/usr/local/rvm/gems/ruby-2.0.0-p0@ta/gems/rake-10.0.4/lib/rake/task.rb:246:in `call'
/usr/local/rvm/gems/ruby-2.0.0-p0@ta/gems/rake-10.0.4/lib/rake/task.rb:246:in `block in execute'

I had some debug and some test... Then i moved to 3.2.13 version of active record, and all worked as expected. I didn't find any docs for 3.2.18 version...

I don't mind to use 3.2.13 version, but I got curious about that.

回答1:

First of all, you were using ActiveRecord 2.3.18, not 3.2.18 (the latter of which does not exist, to my knowledge). ActiveRecord 2.3 is getting to be quite old, and I don't believe it's compatible with Ruby 2.0, which you're using.

But the central issue, I think, is that in Rails 2.2-2.3, alias_method_chain was moved to the ActiveSupport module, before being moved back to Module in 3.0. You're not including ActiveSupport in your task, and I think that's what was causing the problem.

So I think a quick fix would be just to require "active_support".