6
8

More than 5 years have passed since last update.

ActiveRecord::Railtieのイニシャライザを上書きする

Last updated at Posted at 2012-05-28

Rails上でActiveRecordを使うとconfig/database.ymlを読み取ってよしなにestablish_connetionをしてくれるけど、
そこら辺の処理を自分でやりたい場合にはRailtieのイニシャライザを上書きする必要がある。

ActiveRecord 3.2.3だと active_record/railtie.rb のなかに次のようなコードがある。

initializer "active_record.initialize_database" do |app|
  ActiveSupport.on_load(:active_record) do
    self.configurations = app.config.database_configuration
    establish_connection
  end
end

このactive_record.initialize_databaseというイニシャライザを config/application.rb のあたりで置き換えてやる。
場所はif defined?(Bundler)の下あたり(で動いてる)。

ActiveRecord::Railtie.initializers.delete_if do |i|
  i.name == "active_record.initialize_database"
end
module ActiveRecord
  class Railtie < Rails::Railtie
    initializer "active_record.initialize_database", after: "active_record.set_configs" do |app|
      ActiveSupport.on_load(:active_record) do
        # ここにやりたいことを書く
      end
    end
  end
end

ちなみにこのように置き換える場合はinitializerメソッドの:beforeもしくは:afterが必要っぽい。
これがないとtopological sort failedという例外が投げられる。
なのでバージョンによってactive_record/railtie.rbを読んで、前後のイニシャライザからここの値を指定してやる。

6
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
8