Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 具有并属于多个数据库的多个关系_Ruby On Rails_Ruby_Database_Has And Belongs To Many - Fatal编程技术网

Ruby on rails 具有并属于多个数据库的多个关系

Ruby on rails 具有并属于多个数据库的多个关系,ruby-on-rails,ruby,database,has-and-belongs-to-many,Ruby On Rails,Ruby,Database,Has And Belongs To Many,我有一种情况,我有两个模型,公司和权限,其中公司与我的权限数据库位于一个单独的数据库中。这是一个has并属于多个关系,因为每个公司都可以拥有多个权限,每个权限都可以属于多个公司 这两个数据库被拆分的原因是,公司数据库运行一个高需求的生产应用程序,而权限数据库控制另一个应用程序的权限 使用rails,它会在与主表相同的数据库中查找联接表。例如,如果我使用company.permissions,它会在公司数据库中查找company\u权限。如果我执行permission.companys,它将在权限

我有一种情况,我有两个模型,公司和权限,其中公司与我的权限数据库位于一个单独的数据库中。这是一个has并属于多个关系,因为每个公司都可以拥有多个权限,每个权限都可以属于多个公司

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

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


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

如果公司数据不经常更改,也许您可以将数据同步到权限数据库中,然后自然加入。我继承的一个CMS是这样做的:用户身份验证在它自己的数据库中,权限等都存储在那里,用户帐户同步到每个站点的本地数据库。通过这种方式,用户帐户可以通过1次登录在多个站点之间共享(特别是用于管理)


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

已经并属于许多人,但这些人都是老的、笨重的、有问题的。我建议用has_许多代替。 您可以使用“:至”选项指定关系表;只需选择希望它驻留在哪个数据库中,并创建一个模型来表示它。
有趣的问题。为了我自己的参考,让我试着在这个问题的上下文中总结一下Rails菜谱书中提出的解决方案

1) 第一个外接程序database.yml

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

class Permission < ActiveRecord::Base

  establish_connection :permissions

end 
class External < ActiveRecord::Base

  self.abstract_class = true
  establish_connection :permissions

end

class Permission < External
end
类权限
3) 创建(迁移)具有权限Id列的权限引用表

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

class PermissionReference“公司权限”,
:foreign\u key=>'permission\u id'
结束
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公司“PermissionReference”,
:join_table=>“公司权限”,
:关联\外部\密钥=>“权限\ id”
结束

您可能想通过调用外部数据库

的子类模型来考虑重构。
class Permission < ActiveRecord::Base

  establish_connection :permissions

end 
class External < ActiveRecord::Base

  self.abstract_class = true
  establish_connection :permissions

end

class Permission < External
end
class外部
此答案与此页面非常相似:是的,该页面基本上是Rails配方书中配方15的副本,我的答案基于此。:)我之所以选择这个答案而不是下面更完整的答案,是因为有了下面的答案,您仍然需要进行某种同步。使用这个方法,您只需要告诉ruby表名。