首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >与多个数据库具有并属于多个关系

与多个数据库具有并属于多个关系
EN

Stack Overflow用户
提问于 2008-10-08 20:03:46
回答 3查看 5.5K关注 0票数 7

我有一个情况,我有两个模型,公司和权限,其中公司与我的权限数据库在不同的数据库中。这是一个拥有并属于多个公司的关系,因为每个公司可以拥有许多权限,并且每个权限可以属于多个公司。

拆分这两个数据库的原因是,公司数据库运行高要求的生产应用程序,而权限数据库控制另一个应用程序的权限。

使用rails,它在与主表相同的数据库中查找连接表。例如,如果我执行company.permissions,它将在公司数据库中查找company_permissions。如果我使用permission.companies,它会在权限数据库中查找。

使用具有多个数据库的has和属于多个关系的最佳解决方案是什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2008-10-08 20:50:48

拥有并属于许多人是陈旧、笨拙和有问题的。我推荐使用has_many。您可以使用":through“选项指定关系表;只需选择希望它驻留在哪个数据库中,并创建一个模型来表示它。http://apidock.com/rails/ActiveRecord/Associations/ClassMethods/has_many

票数 6
EN

Stack Overflow用户

发布于 2008-10-09 07:52:51

这个问题很有趣。为了便于参考,让我试着在这个问题的上下文中总结一下Rails配方书中提出的解决方案。

1)首先添加database.yml

代码语言:javascript
复制
permissions:
  adapter: mysql
  database: permissions
  username: root
  password: 
  socket: /tmp/mysql.sock

2)建立调用外部数据库的权限模型

代码语言:javascript
复制
class Permission < ActiveRecord::Base

  establish_connection :permissions

end 

3)创建(迁移)权限对照表,权限Id列

4)使用PermissionReference模型作为权限模型的链接

代码语言:javascript
复制
class PermissionReference < ActiveRecord::Base

  belongs_to :permission
  has_and_belongs_to_many :companies,
                          :join_table => 'companies_permissions',
                          :foreign_key => 'permission_id'

end

5)最后关联公司到权限

代码语言:javascript
复制
class Company < ActiveRecord::Base

  has_and_belongs_to_many :permissions, 
                          :class_name => 'PermissionReference', 
                          :join_table => 'companies_permissions', 
                          :association_foreign_key => 'permission_id'

end

您可能需要考虑通过对调用外部数据库的模型进行子类化来进行重构

代码语言:javascript
复制
class External < ActiveRecord::Base

  self.abstract_class = true
  establish_connection :permissions

end

class Permission < External
end
票数 6
EN

Stack Overflow用户

发布于 2008-10-08 20:28:18

如果公司数据不经常更改,也许您可以将数据同步到权限数据库中,然后自然地进行连接。我继承的一个CMS正在做一些类似的事情,其中用户身份验证在它自己的数据库中,权限等都存储在那里,用户帐户被同步到每个站点的本地数据库。这样,只需登录一次,就可以在多个站点之间共享用户帐户(尤其是管理帐户)。

可能不是最好的,因为涉及到同步。理想情况下,如果不能移出权限,您应该只将公司数据存储在权限数据库中。当然,除非你是在其他地方加入公司。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/184600

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档