Rails 7: connected_toでロールの指定が必須でなくなった(翻訳)
RailsのActive Recordには、すぐ使える強力なシャーディング機能があります。垂直シャーディングと水平シャーディングのどちらでも定義可能で、connected_to
で両者を切り替えられます。すべてのデータベースコネクションは、connected_to
ブロックで指定した設定に沿ってこのメソッド内で実行されます。
シャーディングは、以下のようにconfig/database.yml
で設定します。
development:
primary:
<<: *default
database: primary_database
primary_shard_two:
<<: *default
database: primary_shard_two
primary_shard_two_replica:
<<: *default
database: primary_shard_two
replica: true
続いてApplicationRecord
でコネクションを初期化します。
class ApplicationRecord < ActiveRecord::Base
self.abstract_class = true
connects_to shards: {
default: { writing: :primary, reading: :primary_replica },
shard_two: { writing: :primary_shard_two, reading: :primary_shard_two_replica }
}
end
上のprimary
とprimary_shard_two
は互いにreplicaになっていない点にご注意ください。この2つは、同じスキーマを共有する独立したデータベースです。primary_replica
とprimary_shard_two_replica
はreplicaです。
改修前
connected_to
ブロックでは、当初「シャーディング名」「ロール」という2つの必須パラメータを指定する必要がありました。これは構文上の混乱を減らすためです。
以下の例をご覧ください。
ActiveRecord::Base.connected_to(role: :reading, shard: :default) do
puts ActiveRecord::Base.connection_db_config.name
Blog.count
end
primary_replica
Blog Count (3.1ms) SELECT COUNT(*) FROM "blogs"
=> 3
このrole
を省略するとArgumentErrorが発生します。
ActiveRecord::Base.connected_to(shard: :default) do
puts ActiveRecord::Base.connection_db_config.name
Blog.count
end
Traceback (most recent call last):
1: from (irb):1
ArgumentError (`connected_to` cannot accept a `shard` argument without a `role`.)
改修後
role
をすべてのconnected_to
ブロックに指定しなくてもよいように変更されました(#43391)。
この改修の目的は、実行がシャーディングだけに関連するときはrole
パラメータを渡さなくても済むようにすることです。また、ロールを使わずにwriterのシャーディングのみを利用するアプリケーションでconnected_to
メソッド呼び出しを簡潔にしながら、今後複雑なマルチテナンシーで作業できる道も開かれます。
概要
元サイトの許諾を得て翻訳・公開いたします。