【问题标题】:How select specific tenant after enter on console?在控制台输入后如何选择特定租户?
【发布时间】:2026-01-27 17:35:02
【问题描述】:

下面存储在config/initializers/console.rb 的代码仅在我第一次执行rails console CLI 时有效。再次退出进入时,不显示选择信息,但加载了选择的预览租户。

if defined?(Rails::Console) || $PROGRAM_NAME.include?('spring')
  tenants = Apartment.tenant_names.sort
  default = tenants.first

  puts "Available tenants: #{tenants.join(', ')}"

  print "Select tenant (#{default}): "
  tenant = gets.strip

  Apartment::Tenant.switch! tenants.include?(tenant) ? tenant : default
end

我希望每次在rails console输入时询问将加载哪个租户。

谢谢!

【问题讨论】:

标签: ruby-on-rails multi-tenant apartment-gem


【解决方案1】:

我获得 Apartment::Tenant.switch 的唯一方法!在 Rails 控制台中工作的方法是在项目的根目录中创建以下 .irbrc 文件:

IRB.conf[:IRB_RC] = Proc.new do
  tenants = Apartment.tenant_names.sort
  puts "Available tenants: #{tenants.join(', ')}"

  print "Select tenant: "
  tenant = gets.strip

  unless tenant.empty?
    if tenants.include?(tenant)
      Apartment::Tenant.switch!(tenant)
    else
      puts "Tenant not found in list '#{tenant}'"
    end
  end
  puts "Tenant set to '#{Apartment::Tenant.current}'"
end

【讨论】:

【解决方案2】:

我遇到了类似的问题。如果您使用的是公寓宝石。在您的 Rails 控制台中,您可以先连接到 DB,然后使用 schema_search_path 在租户之间切换

e.g.
c = Company.connection
c.schema_search_path = "tenant1"

要检查租户是否已切换,请使用ActiveRecord::Base.connection.schema_search_path

=> "\"tenant1\""

Company 只是我数据库中的一张表。

【讨论】:

    【解决方案3】:

    这是一个简单的代码(pry 版本),可在launchconsole 使用

    `Apartment::Tenant.switch!` during `bin/rails console` using `pry`

    【讨论】:

      【解决方案4】:

      这是因为 Spring,默认情况下它仅配置用于开发环境。只需将其从您的 Gemfile 中删除,它就会按预期工作。

      【讨论】: