我的情况是我有两个模型,公司和权限,其中公司与我的权限数据库位于一个单独的数据库中。这是一个并且属于许多关系,因为每个公司可以拥有许多权限,每个权限可以属于许多公司。
拆分两个数据库的原因是公司数据库运行高需求生产应用程序,权限数据库控制另一个应用程序的权限。
使用rails,它会在与主表相同的数据库中查找连接表。例如,如果我执行company.permissions,它会在公司数据库中查找company_permissions。如果我允许,请在权限数据库中查找。
使用has并且属于多个数据库的多种关系的最佳解决方案是什么?
答案 0 :(得分:6)
有趣的问题。为了我自己的参考,让我试着在这个问题的上下文中总结 Rails Recipe 一书中提出的解决方案。
1)首先添加 database.yml
permissions:
adapter: mysql
database: permissions
username: root
password:
socket: /tmp/mysql.sock
2)使Permission模型调用外部数据库
class Permission < ActiveRecord::Base
establish_connection :permissions
end
3)使用权限ID 列创建(迁移)权限参考表
4)使用 PermissionReference 模型作为权限模型的链接
class PermissionReference < ActiveRecord::Base
belongs_to :permission
has_and_belongs_to_many :companies,
:join_table => 'companies_permissions',
:foreign_key => 'permission_id'
end
5)最后将公司与许可联系起来
class Company < ActiveRecord::Base
has_and_belongs_to_many :permissions,
:class_name => 'PermissionReference',
:join_table => 'companies_permissions',
:association_foreign_key => 'permission_id'
end
您可能希望通过子类化调用外部数据库的模型来考虑重构
class External < ActiveRecord::Base
self.abstract_class = true
establish_connection :permissions
end
class Permission < External
end
答案 1 :(得分:5)
拥有并且属于许多人是旧的,笨重的,有问题的。我建议改用has_many。 您可以使用“:through”选项指定关系表;只需选择您希望它驻留在哪个数据库中,并创建一个模型来表示它。 http://apidock.com/rails/ActiveRecord/Associations/ClassMethods/has_many
答案 2 :(得分:1)
如果公司数据不经常更改,也许您可以将数据同步到权限数据库中,然后自然地进行连接。我继承的CMS正在做类似的事情,其中用户身份验证在其自己的数据库中,并且权限等都存储在那里,并且用户帐户与每个站点的本地数据库同步。这样,用户帐户可以通过1次登录在多个站点上共享(尤其是管理)。
可能不是最好的,因为涉及同步。理想情况下,如果无法移出权限,则应将公司数据存储在权限db中。当然,除非你在其他地方加入公司。