複数のデータベースとの多くの関係を持ち、属している
-
06-07-2019 - |
質問
会社と権限の2つのモデルがあり、会社が権限データベースとは別のデータベースにある状況があります。各企業は多くの権限を持つことができ、各権限は多くの会社に属することができるため、これは多くの関係にあります。
2つのデータベースが分割される理由は、会社のデータベースが需要の高い本番アプリケーションを実行し、権限データベースが別のアプリケーションの権限を制御するためです。
レールを使用すると、プライマリテーブルと同じデータベースで結合テーブルを探します。たとえば、company.permissionsを実行すると、company_permissionsの会社データベースが検索されます。 permission.companiesを実行すると、権限データベースが検索されます。
hasを使用する最良のソリューションは何ですか?また、複数のデータベースとの多くの関係に属しますか?
解決
多くの人が所有しているのは古くて不格好で、問題があります。代わりにhas_manyを使用することをお勧めします。 ":through"で関係テーブルを指定できます。オプション;どのデータベースに常駐させるかを選択し、それを表すモデルを作成するだけです。 http://apidock.com/rails/ActiveRecord/Associations/ClassMethods/has_many
他のヒント
興味深い質問。私自身の参考のために、 Rails Recipe の本で提案されている解決策をこの質問の文脈で要約してみましょう。
1)最初に database.yml
を追加しますpermissions:
adapter: mysql
database: permissions
username: root
password:
socket: /tmp/mysql.sock
2)許可モデルを作成して外部データベースを呼び出す
class Permission < ActiveRecord::Base
establish_connection :permissions
end
3) Permission Id 列を持つ Permission Reference table を作成(移行)します
4) PermissionReference モデルを Permission モデルへのリンクとして使用する
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
会社のデータがあまり頻繁に変更されない場合は、おそらくデータを許可データベースに同期してから、自然に結合することができます。私が継承したCMSは、ユーザー認証が独自のデータベースにあり、権限などがすべてそこに保存され、ユーザーアカウントが各サイトのローカルデータベースに同期されるようなことをしています。この方法により、1回のログインで複数のサイトでユーザーアカウントを共有できます(特に管理用)。
同期が関係しているため、最高ではないかもしれません。権限を移動できない場合は、会社のデータを権限データベースに保存するのが理想的です。もちろん、他の会社に参加する場合を除きます。