7

会社と権限の 2 つのモデルがあり、会社が権限データベースとは別のデータベースにある状況があります。各会社は多くの権限を持つことができ、各権限は多くの会社に属することができるため、これは複数の所有者の関係です。

2 つのデータベースが分割されている理由は、会社のデータベースが需要の高い運用アプリケーションを実行し、アクセス許可データベースが別のアプリケーションのアクセス許可を制御するためです。

Rails では、プライマリ テーブルと同じデータベース内の結合テーブルを探します。たとえば、company.permissions を実行すると、会社のデータベースで company_permissions が検索されます。私が permission.companies を実行すると、アクセス許可データベースが検索されます。

複数のデータベースとの has and belongs to many 関係を使用するための最適なソリューションは何ですか?

4

3 に答える 3

6

多くの人に属し、古く、不格好で、問題があります。代わりに has_many を使用することをお勧めします。":through" オプションで関係テーブルを指定できます。配置するデータベースを選択し、それを表すモデルを作成するだけです。 http://apidock.com/rails/ActiveRecord/Associations/ClassMethods/has_many

于 2008-10-08T20:50:48.237 に答える
6

興味深い質問です。私自身の参考のために、この質問のコンテキストでRails Recipe book で提案されているソリューションを要約してみましょう。

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)権限 ID列を含む権限参照テーブルを作成 (移行) します。

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) 最後に、Company を Permission に関連付けます

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
于 2008-10-09T07:52:51.147 に答える
1

会社のデータがあまり頻繁に変更されない場合は、おそらくデータをアクセス許可データベースに同期してから、自然に参加することができます。私が継承した CMS は、ユーザー認証が独自のデータベースにあり、アクセス許可などがすべてそこに保存され、ユーザー アカウントが各サイトのローカル データベースに同期されるようなことを行っています。このようにして、1 回のログインで複数のサイト間で (特に管理用に) ユーザー アカウントを共有できます。

同期が関係しているため、最適ではない可能性があります。パーミッションを移動できない場合は、会社のデータをパーミッション データベースに保存するのが理想的です。もちろん、あなたが他の会社に参加している場合を除きます。

于 2008-10-08T20:28:17.847 に答える