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:从表单输入动态创建/切换/迁移数据库的主要内容,如果未能解决你的问题,请参考以下文章

Rails 创建没有迁移的表

Rails cocoon 动态创建link_to_add_association

Rails 6将输入添加到页面中的列表

如何通过 Rails 迁移克隆数据库表?

Rails:使用脚手架后,我无法迁移

动态表单(切换实体)symfony2