rails6にアップデートしたので `switch_point` gemを外す

# やりたいこと
* 複数DBに接続する際にお世話になっていたgem `switch_point` がrails6.1はサポートしないということなのでで外す

# 対応したこと
## switch_pointの削除
```rb
gem 'switch_point' # 削除
```

`bundle install` 実行


## database.ymlの変更
### 変更前
```yaml
default: &default
  adapter: mysql2
  username: <%= ENV['DATABASE_USERNAME'] %>
  password: <%= ENV['DATABASE_PASSWORD'] %>
  host: <%= ENV['DATABASE_HOST'] %>
  database: <%= ENV['DATABASE_NAME'] %>
  socket:  <%= ENV['DATABASE_SOCKET'] %>

default_readonly: &default_readonly
  <<: *default
  host: <%= ENV['DATABASE_HOST_READONLY'] %>

development:
  <<: *default
development_readonly:
  <<: *default_readonly

production:
  <<: *default
production_readonly:
  <<: *default_readonly
```

### 変更後
```yaml
default: &default
  adapter: mysql2
  username: <%= ENV['DATABASE_USERNAME'] %>
  password: <%= ENV['DATABASE_PASSWORD'] %>
  host: <%= ENV['DATABASE_HOST'] %>
  database: <%= ENV['DATABASE_NAME'] %>
  socket:  <%= ENV['DATABASE_SOCKET'] %>

default_readonly: &default_readonly
  <<: *default
  host: <%= ENV['DATABASE_HOST_READONLY'] %>

development:
  primary:
    <<: *default
  primary_replica:
    <<: *default_readonly

production:
  primary:
    <<: *default
  primary_replica:
    <<: *default_readonly
```

## ApplicationRecordの変更
### 変更前
```rb
class ApplicationRecord < ActiveRecord::Base
  self.abstract_class = true
  use_switch_point :master
end
```

### 変更後
```rb
class ApplicationRecord < ActiveRecord::Base
  self.abstract_class = true
  connects_to database: { writing: :primary, reading: :primary_replica }
end
```

## ログ出力設定
* ここは [dely Tech Blog / Rails6の複数データベースの仕組みと実装時にハマったところ](https://tech.dely.jp/entry/rails6_multiple_db) の記事そのままです。

### MultipleDatabaseConnectionLoggerクラスの作成
```rb
class MultipleDatabaseConnectionLogger < Arproxy::Base
  def execute(sql, name = nil)
    role = ActiveRecord::Base.current_role
    name = "#{name} [#{role}]"
    super(sql, name)
  end
end
```

### arproxy.rbの変更
#### 変更前
```rb
if Rails.env.development? || Rails.env.test?
  require 'switch_point_logger_enhancement'
  Arproxy.configure do |config|
    config.adapter = 'mysql2'
    config.use SwitchPointLoggerEnhancement
  end
  Arproxy.enable!
end
```

#### 変更後
```rb
if Rails.env.development? || Rails.env.test?
  require 'multiple_database_connection_logger'
  Arproxy.configure do |config|
    config.adapter = 'mysql2'
    config.use MultipleDatabaseConnectionLogger
  end
  Arproxy.enable!
end
```

### 不要なファイルの削除
* `config/initializer/switch_point.rb`
* `lib/switch_point_logger_enhancement.rb`


### アプリケーションの変更
#### 変更前
```rb
ApplicationRecord.with_readonly do
  ...
end
```

#### 変更後
```rb
ApplicationRecord.connected_to(role: :reading) do
  ...
end
```

#### おまけ
私の場合`ApplicationRecord`に`with_readonly`というメソッドを作って、今まで通りの書き方ができるようにしました。

```rb
class ApplicationRecord < ActiveRecord::Base
  self.abstract_class = true

  connects_to database: { writing: :primary, reading: :primary_replica }

  def self.with_readonly(&block)
    ActiveRecord::Base.connected_to(role: :reading, &block)
  end
end
```


---


# 参考リンク
* [github / switch_point](https://github.com/eagletmt/switch_point) 
* [Railsガイド / Active Record で複数のデータベース利用](https://railsguides.jp/active_record_multiple_databases.html)
* [dely Tech Blog / Rails6の複数データベースの仕組みと実装時にハマったところ](https://tech.dely.jp/entry/rails6_multiple_db)


いつもQiitaにはお世話になってます。