0

Rails 7の multidb shardingを試しています。Railsコンソール セッションのデフォルトのシャードを設定できるようにしたいと考えています。

使うことができます

ActiveRecord::Base.connected_to(role: :writing, shard: :default) do
  @id = Person.create! # Creates a record in shard default
end

しかし、それは各コマンドにとって非常に面倒です。コマンドラインから設定する方法はありますか?

shard=shard_one rails c 
4

1 に答える 1

0

database.yml私はこのようにファイルをハッキングしてしまいました


<%= ctrys = ['nl','uk']; main = ENV.fetch('DEFAULT_SHARD'){'nl'}; ctrys.delete(main); ctrys.unshift(main);nil %>
development:
  <%= ctrys[0] %>:
    <<: *default_database
    database: <%= ENV.fetch("DATABASE_DATABASE_#{ctrys[0].upcase}") { Rails.application.credentials.dig(:mysql, :"database_#{ctrys[0]}") } %>
  <%= ctrys[1] %>:
    <<: *default_database
    database: <%= ENV.fetch("DATABASE_DATABASE_#{ctrys[1].upcase}") { Rails.application.credentials.dig(:mysql, :"database_#{ctrys[1]}") } %>

次のように使用できます。

~prompt% DISABLE_SPRING=true DEFAULT_SHARD="uk" rails
Loading development environment (Rails 7.0.1)
hvg-web(dev)> ActiveRecord::Base.connection.pool.db_config.name
=> "uk"

(春はそれをキャッシュするので、春を無効にします)

ただし、このハックはテストランナーに挑戦を与えます:

/usr/src/app# rspec
Running via Spring preloader in process 2504
Running via Spring preloader in process 2510
Rails couldn't infer whether you are using multiple databases from your database.yml and can't generate the tasks for the non-primary databases. If you'd like to use this feature, please simplify your ERB.

ハックのように感じますが、うまくいきます - 他の誰かがより良い計画を思い付くことができるでしょうか?

于 2022-02-03T14:47:15.123 に答える