Как я могу переопределить метод в классе ConnectionAdapter в Rails 3 для использования в задаче rake? - PullRequest
2 голосов
/ 30 октября 2010

Для того, чтобы переопределить table_exists?Метод в адаптере Rails PostgreSQL Я попробовал следующее в файле инициализатора:

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

Это вызовет следующую ошибку:

uninitialized constant ActiveRecord::ConnectionAdapters::PostgreSQLAdapter

Я полагаю, это сработало бы в предыдущемверсии rails, и я даже нашел небольшой плагин , который делал что-то подобное в Rails 2.3.6 .Также я сталкиваюсь с этой ошибкой, только когда пытаюсь запустить задачу rake, такую ​​как db: migrate, а не при запуске сервера приложений.

Может кто-нибудь показать мне правильный способ сделать это и / или объяснить, почему PostgreSQLAdapterне загружается, когда я в файле инициализатора?

Ответы [ 2 ]

0 голосов
/ 30 октября 2010

Я добился успеха, переместив этот код в плагин Rails.Это немного больше накладных расходов, но оно работает стабильно, когда я запускаю rails s и когда я запускаю rake db:migrate.

, я просто следую за страницей руководства rails по теме ипобежал

rails generate plugin rails_patches --with-generator

и переместил мой файл init.rb в рельсы, как рекомендовано.

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

Я поместил этот код в init.rb:

require 'rails_patches'

Я поместил этот код в rails_patches.rb:

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

Теперь он ведет себя как яожидается.

0 голосов
/ 30 октября 2010

Вместо config / initializer поместите этот код в папку lib /.

Хотя это означает, что active_record загружается после инициализаторов рельсов, что необычно.Я уточню это более подробно, как только я закончу исследование всего потока.Если вы хотите узнать больше о процессе инициализации rails 3, перейдите по этой ссылке:

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

...