【发布时间】:2021-08-31 19:41:38
【问题描述】:
我正在尝试构建一个应用程序,它将使用最新的 Rails 6.1 功能之一:multiple databases - 您可以阅读底部的源代码。
我想通过能够根据请求域在数据库之间切换来实现多租户。
每个俱乐部都有自己的数据库,一个主数据库将存储应用程序特定的数据,例如用户、俱乐部。
我创建了两种类型的记录:GlobalRecord 使用 primary 数据库和 ShardRecord 使用水平分片数据库。
并且还尝试使用around_action 选择当前俱乐部数据库。
# config/database.yml
default: &default
adapter: postgresql
encoding: unicode
development:
primary:
<<: *default
database: primary
migrations_paths: db/migrate
club_1:
<<: *default
database: club_1
migrations_paths: db/shard_migrate
club_2:
<<: *default
database: club_2
host: 1.1.1.1
username: deploy
password: pass
migrations_paths: db/shard_migrate
class Club < GlobalRecord; end
class GlobalRecord < ActiveRecord::Base
self.abstract_class = true
connects_to shards: {
club_1: { writing: :primary, reading: :primary },
club_2: { writing: :primary, reading: :primary }
}
end
class MemberRecord < ShardRecord; end
class ShardRecord < ActiveRecord::Base
self.abstract_class = true
connects_to shards: {
club_1: { writing: :club_1, reading: :club_1 },
club_2: { writing: :club_2, reading: :club_2 }
}
end
class ApplicationController < ActionController::API
before_action :set_club
around_action :connect_to_shard
private
def set_club
@club = SelectClubByDomain.new(request).slug
end
def connect_to_shard
ActiveRecord::Base.connected_to(role: :writing, shard: @club.slug) do
yield
end
end
end
我有几个设计问题/问题想问你:
- 我想设置
GlobalRecord和connects_to database: { writing: :primary }但因为我添加了around_action我必须像上面那样设置它。 是不好的设计吗? 我可以重构它,以便在没有ActiveRecord::Base.connected_to(role: :writing, shard: :club_1)块的情况下始终调用 GlobalRecord 吗?
尝试在around_action 中使用ActiveRecord::Base.connected_to_many(GlobalRecord, ShardRecord, role: :writing, shard: @club_slug.to_sym),但应请求(clubs#index => [Club.all]) 出现错误:
ActiveRecord::ConnectionNotEstablished (No connection pool for 'GlobalRecord' found for the 'club_1' shard.)
- 在生产服务器上启动时我看到此警告,如何解决?
=> Run `bin/rails server --help` for more startup options
Failed to define attribute methods because of ActiveRecord::ConnectionNotEstablished: ActiveRecord::ConnectionNotEstablished
来源:
【问题讨论】:
标签: ruby-on-rails activerecord multi-tenant multiple-databases