【问题标题】:Rails: Multiple databases, same schemaRails:多个数据库,相同的模式
【发布时间】:2013-04-04 20:44:40
【问题描述】:

我正在进行一个虚构的场景项目,我允许公司的多个用户登录、创建记录等,所有用户都连接到一个数据库。他们都可以记录缺勤记录、考勤记录等。

然而,我想做的是使用相同的架构,但将其扩展为允许多个公司拥有使用相同架构的自己的数据库。所以每个公司都会有自己的数据,但是所有公司都使用相同的数据模型。换句话说,所有公司都可以创建缺勤记录,但他们每个人都只能访问他们自己创建的缺勤记录。

我怎样才能做到这一点?

我只需要两三个文件就可以了,我不会将它用于商业用途,以防你们认为我偷工减料而损害了别人的利益!

像 if-else 这样简单的东西决定使用哪个文件对我来说非常有用,所以如果存在这样的代码行,请告诉我。

【问题讨论】:

  • 这个问题可能会被关闭,因为它有点过于概念化,没有指定您正在使用哪个 RDMS,并且可能更适合其他 stackexchange 站点之一。但是,您在此处查找的术语是 multitenancy。将该术语与rails 和您最喜欢的 RDMS 的名称结合起来,我相信您会找到一些指示。
  • 抱歉,我使用的是 SQLite3。顺便说一句,多租户在我的搜索中弹出了几次,我会看看它。谢谢!
  • 会有two great RailsCasts on Multitenacy,两个专业剧集。

标签: ruby-on-rails database database-connection


【解决方案1】:

我认为您做错了(除非您有充分的理由为每家公司都拥有一个数据库),因为您似乎在一遍又一遍地重复您的数据模型,同时为您的代码引入了不必要的复杂性。

尝试将所有公司放在一个数据库/表中,并用company_id 分隔。

例如:数据结构如下

companies table
id
name


users table
id
user_name
company_id

但是,如果您真的想连接到多个数据库,请查看此SO question

【讨论】:

  • 这绝对是更简单的选择。感谢您的回答!但是,该项目目前有许多对特定类型的所有模型的引用(例如 Absence.all)。有什么方法可以通过公司 ID 在应用程序控制器中,在前置过滤器中确定所有此类代码的范围?我只是问,否则我将有很多重构要做... 编辑:刚刚发现这个:apidock.com/rails/ActiveRecord/Base/default_scope/class 以防有人想知道我用什么来解决这个问题。感谢大家的帮助!
  • 根据我提出的实现,您需要添加一些与company 模型的关系方式(例如:可能缺席模型将有一个 user_id 而用户模型将有一个 company_id),然后当您的用户登录时,将他的 company_id 获取到会话并在需要时使用它。 (当然,当它涉及授权和所有时,它比这复杂一点)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 2016-08-05
  • 1970-01-01
  • 1970-01-01
  • 2012-01-15
  • 1970-01-01
相关资源
最近更新 更多