質問

会社と権限の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回のログインで複数のサイトでユーザーアカウントを共有できます(特に管理用)。

同期が関係しているため、最高ではないかもしれません。権限を移動できない場合は、会社のデータを権限データベースに保存するのが理想的です。もちろん、他の会社に参加する場合を除きます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top