views:

15

answers:

2

In order to override the table_exists? method in the Rails PostgreSQL adapter I have tried the following in an initializer file:

ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.class_eval do
  def table_exists?(name)
    raise 'got here'
  end
end

This will raise the the following error:

uninitialized constant ActiveRecord::ConnectionAdapters::PostgreSQLAdapter

I believe this would have worked in previous versions of rails and I even found a small plugin that did something like this in Rails 2.3.6. Also I only encounter this error when I am trying to run a rake task like db:migrate and not when I start my application server.

Could someone show me the right way to do this and / or explain why PostgreSQLAdapter doesn't seem to be loaded when I am in an initializer file?

A: 

Instead of config/initializers, place that code in lib/ folder.

While this means that the active_record is loaded after the rails initializers, which is unusual. I ll update this with more detail, once I am done investigating the whole flow. If you want some more details about the rails 3 initialization process, check out this link:

http://ryanbigg.com/guides/initialization.html

Rishav Rastogi
When I put the above code in the lib folder it doesn't even seem to load even though I have config.autoload_paths += %W(#{config.root}/lib) in my application file. Perhaps I just need to understand how autoloading works in general. Thanks for the link, I'm reading through that.
Mitch
A: 

I had success by moving this code into a Rails plugin. It is a little bit more overhead, but it is working consistently when I run rails s and when I run rake db:migrate.

I just followed the rails guide page on the topic and ran

rails generate plugin rails_patches --with-generator

and moved my init.rb file into rails as recommended.

~vendor/
 `~plugins/
   `~rails_patches/
     |~lib/
     | `-rails_patches.rb
     |~rails/
     | `-init.rb
     |+test/
     |-install.rb
     |-MIT-LICENSE
     |-Rakefile
     |-README
     `-uninstall.rb

I put this code in init.rb:

require 'rails_patches'

I put this code in rails_patches.rb:

ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.class_eval do
  def table_exists?(name)
    raise 'got here'
  end
end

This now behaves as I expected.

Mitch