Tech Racho エンジニアの「?」を「!」に。
  • Ruby / Rails関連

Rails 7: connected_toでロールの指定が必須でなくなった(翻訳)

概要

元サイトの許諾を得て翻訳・公開いたします。

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

上のprimaryprimary_shard_twoは互いにreplicaになっていない点にご注意ください。この2つは、同じスキーマを共有する独立したデータベースです。primary_replicaprimary_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メソッド呼び出しを簡潔にしながら、今後複雑なマルチテナンシーで作業できる道も開かれます。

関連記事

Rails 7: スキーマキャッシュが遅延読み込み可能になった(翻訳)


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。