2008-10-08 61 views
7

我有兩種模式,公司和權限,公司與我的權限數據庫位於不同的數據庫中。這是一個並且屬於許多關係,因爲每個公司都可以擁有許多權限,並且每個權限都可以屬於許多公司。擁有並屬於與多個數據庫的許多關係

兩個數據庫分離的原因是公司數據庫運行高需求生產應用程序,權限數據庫控制另一個應用程序的權限。

使用rails時,它會在與主表相同的數據庫中查找連接表。例如,如果我執行company.permissions,它將在公司數據庫中查找company_permissions。如果我執行了permission.companies,它會查看權限數據庫。

什麼是使用has的最佳解決方案,屬於與多個數據庫的多種關係?

回答

5

擁有和屬於許多是古老,笨重和有問題的。我建議使用has_many來代替。 您可以使用「:through」選項指定關係表;只需選擇您希望它駐留的數據庫並創建一個模型來表示它。 http://apidock.com/rails/ActiveRecord/Associations/ClassMethods/has_many

+0

我拿起這個答案過的原因下面更完整的答案是因爲下面的答案,你仍然需要做一些同步。用這種方法,你只需要告訴ruby表名。 – Steropes 2008-10-10 12:31:27

1

如果公司數據沒有經常更改,也許您可​​以將數據同步到權限數據庫中,然後自然加入。我繼承的一個CMS正在做類似於用戶身份驗證位於其自己的數據庫中的內容,並且權限等全部存儲在那裏,並且用戶帳戶與每個站點的本地數據庫同步。通過這種方式,可以跨多個站點共享(特別是針對管理)用戶帳戶,並擁有1次登錄。

可能不是最好的,因爲涉及同步。理想情況下,如果您無法將權限移出,則應將公司數據存儲在權限數據庫中。除非你在其他地方加入公司。

6

有趣的問題。爲了我自己的參考,讓我試着在這個問題的上下文中總結Rails Recipes書中提出的解決方案。

1)首先加入數據庫。陽明海運

permissions: 
    adapter: mysql 
    database: permissions 
    username: root 
    password: 
    socket: /tmp/mysql.sock 

2)請權限模型調用外部數據庫

class Permission < ActiveRecord::Base 

    establish_connection :permissions 

end 

3)創建(遷移)一權限參考表權限編號

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 
+0

這個答案看起來非常類似於這個頁面:https://calshare.berkeley.edu/sites/AS/Web_Apps/ruby/Wiki%20Pages/Connecting%20to%20Multiple%20Databases.aspx – Steropes 2008-10-09 13:09:20

相關問題