Rails 6:从表单输入动态创建/切换/迁移数据库
Posted
技术标签:
【中文标题】Rails 6:从表单输入动态创建/切换/迁移数据库【英文标题】:Rails 6: Dynamically create/switch/migrate database from form input 【发布时间】:2021-12-07 15:07:34 【问题描述】:首先这可能吗? 假设我们有一个组织,我们希望动态地为每个组织隔离数据库。 案例 1 如果管理员想要创建一个组织,并且该组织的数据库已经存在。没有其他任务。案例 2 如果管理员想要创建一个组织,但该组织的数据库不存在。创建一个新数据库并根据我们拥有的迁移列表运行迁移。数据库名称将是从表单输入中获取的特定组织的名称。 结果 稍后每当组织通过我们的应用程序登录时。数据库需要根据组织进行切换。 再次有可能吗?如果有人回答这个问题或提供破解方法来实现它,那将是一个很大的帮助。 Rails 版本:6.1.4.1 数据库:Postgresql
【问题讨论】:
当然,您可以关闭旧连接并打开一个新连接。还有一个CREATE DATABASE
声明。
我首先想到的是,Rails 6 在模型上提供了connects_to
方法,我们现在正在使用它(我们有几个数据库)。数据库的名称是静态的,而且connects_to
需要database.yml
中提供的信息。在我们的例子中,一切都需要是动态的。
【参考方案1】:
在组织类中你需要调用establish_connection
例如
ActiveRecord::Base.establish_connection(
adapter: "mysql2",
host: "localhost",
username: "myuser",
password: "mypass",
database: "somedatabase"
)
如果你使用devise,想在用户登录后设置组织,可以使用after_set_user回调
Warden::Manager.after_set_user do |user, auth, opts|
# connect to database
end
【讨论】:
我会看看这个。谢谢大哥:) btw 如何制作动态数据库?我不希望它连接到现有的。 需要一个预先存在的默认数据库,Rails 可以在服务器启动时连接到该数据库。所有其他数据库都可以是动态的。我将所有动态数据库存储在默认数据库中的一个表中,并在 after_set_user 回调中进行切换。以上是关于Rails 6:从表单输入动态创建/切换/迁移数据库的主要内容,如果未能解决你的问题,请参考以下文章