2011-07-26 4 views
2

この質問は、Rails 3.0.0です。なぜhas_manyではないのですか?ここで働くことは...隠された制限はありますか?

capabilities 
    id 
    name 

capability_roles 
    role_id 
    capability_id 

user_roles 
    user_id 
    role_id 

users 
    id 
    name 

roles 
    id 
    name 

基本的な機能はroles_capabilitiesに接続 は、ユーザーに接続user_rolesに接続します。

は私が5つのテーブル(不自然しかし、合理的な例として、わずか4分を)持っています。

* _rolesテーブルは単なるマップです。彼らは主キーを持っていません。役割 テーブル自体はこの質問にほとんど付随しています。

これにより、ユーザーが引き受けることが許可されている役割とは独立して、各役割の機能を編集することができます。

には、簡単にの機能があります。

users 
    has_many :user_roles # .joins(:user_roles).to_sql # works 

user_roles 
    belongs_to :user # .joins(:user).to_sql # works 

    # .joins(:capability_roles).to_sql # works (no corresponding belongs_to!) 
    has_many :capability_roles, :primary_key => role_id, :foreign_key => :role_id 

    # .joins(:capabilities).to_sql # fails 
    has_many :capabilities, :through => :capability_roles 

capability_roles 
    belongs_to :capabilities # .joins(:capabilities).to_sql # works 

    # .joins(:user_roles).to_sql # works (no corresponding belongs_to!) 
    has_many :user_roles, :primary_key => role_id, :foreign_key => :role_id 

    # .joins(:users).to_sql # fails 
    has_many :users, :through => :user_roles 

capabilities 
    has_many :capability_roles # .joins(:capability_roles).to_sql # works 

私の質問は::

なぜHAS_MANYていません:仕事を通じてここに?今の関連付けを設定する

has_many:throughが設計されたようです。 missing/relevantのないbelongs_to()が問題であるかどうかはわかりません。

私が見るに障害がある: NoMethodError:nilのための未定義のメソッド `EQ」:NilClass

+0

どこにでもリンクテーブルの名前を指定していますか?私はRailsが複数形でない限り名前を推論しないと確信しています –

+0

実行しようとしているコントローラにコードを投稿できますか?そうすれば、あなたがやりたいこととあなたのモデルがどのように設定されているかの切り分けを判断することができます。 –

+0

このコメントは削除されました。それは間違った場所に上陸した。 – eclectic923

答えて

2

使用しているテーブルを結合をhas_and_belongs_to_many関係ないhas_manyのために設計されており、関連クラスを持つことが期待されていません。私は次のようなものを持っていきます:

Role 
    has_and_belongs_to_many :capabilities 
    has_and_belongs_to_many :users 

User 
    has_and_belongs_to_many :roles 
    has_many :capabilities # use SQL with sub-select through roles to get the capabilities 

Capability 
    has_and_belongs_to_many :roles 
    has_many :users # use SQL with sub-select through roles to get the users 
+0

あなたの答えは混乱の原因となります(書籍「The Rails 3 Way」よりObie Fernandez、など) – eclectic923

+0

あなたの答えは混乱の原因となります。 3 Way by Obie Fernandez、その他) "Josh Susserはアクティブレコードの関連付けの専門家とみなされています... has_many:throughアソシエーションは、同じテーブルを介して間接的に一対多の関係を指定することを可能にします。最大の利点は、結合テーブルに本格的なオブジェクトが含まれていることです。他のpush_with_attributes; joinモデルは、他のActive Recordモデルと同じように機能します。 – eclectic923

+0

引用したテキスト、has_many:through'を使う理由は、joinテーブルが単純にjoinよりも多くの属性を含んでいる場合ですID - これは独自のモデルとして役立ちます。あなたの場合は、結合テーブルに結合IDだけが表示されているので、別のモデルとしては意味がありません。あなたの例に基づいて、habtmが最良の選択肢です。 –

関連する問題