开发者

How can I override a method in a ConnectionAdapter class in Rails 3 for use in a rake task?

开发者 https://www.devze.com 2023-01-22 22:58 出处:网络
In order to override the table_exists? method in the Rails PostgreSQL adapter I have tried the following in an initializer file:

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 o开发者_运维问答nly 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?


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


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.

0

精彩评论

暂无评论...
验证码 换一张
取 消