2011-09-12 27 views
1

私は特定のユーザのすべての投稿を仲間関係で抽出しようとしています。私はそれが正しいかどうか分からないので、私はよく説明します。ユーザーは、一部のグループに所有権とメンバーシップを持っています。ユーザーは、グループのメンバーまたは所有者のいずれかになることができますが、両方のメンバーになることはできません。すべての投稿はユーザーとグループのIDを持ちます。私は問題が以下の関係に起因すると思う。どのように私はそれを回避することができますか?もう一つ。私はまた、ユーザーのグループに他のユーザーが投稿した投稿をすべて見つけなければなりません。言い換えれば、私はグループを通過する必要があります。Ruby on Rails 3で3つのテーブルに結合する

 /-- Owner ---\ 
User --    -- Group -- Post 
    | \-- Member --/    | 
    |_______________________________| 

class User < ActiveRecord::Base 
    has_many :posts, :dependent => :destroy 
    has_many :ownerships, :foreign_key => "user_id", :dependent => :destroy 
    has_many :memberships, :foreign_key => "user_id", :dependent => :destroy 

    # Problem with these two? I think so. 
    has_many :groups, :through => :memberships, :source => :user 
    has_many :groups, :through => :ownerships, :source => :user 

class Ownership < ActiveRecord::Base 
    belongs_to :users, :class_name => "User" 
    belongs_to :groups, :class_name => "Group" 
    has_many :posts, :through => :groups, :source => :posts 

class Membership < ActiveRecord::Base 
    belongs_to :users, :class_name => "User" 
    belongs_to :groups, :class_name => "Group" 
    has_many :posts, :through => :groups, :source => :posts 

class Group < ActiveRecord::Base 
    has_many :posts, :dependent => :destroy 

class Post < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :groups 

誤差がラインから来ている:

_groups = user.groups 

誤差を以下のように:モデルの所有権のユーザー:

ソース・アソシエーション(単数または複数)を見つけることができませんでした。 'has_many:groups、:through =>:ownerships、:source =>'を試してください。それはユーザー、グループ、または投稿のいずれかですか?

+0

私はまだ問題を理解していません。期待どおりにあなたにとってうまくいかないのは何ですか? – mkro

+0

@mkro申し訳ありませんが、私はちょうど最後に追加した部分を逃しました。私はまた、メンバーシップとオーナーシップによって、ユーザーに属するグループからすべての投稿を収集する必要があります。 –

+0

@mkro私はより具体的です:これは私にエラーを与えるでしょう - _groups = user.groups モデルの所有権のソースの関連付けを見つけることができませんでした。 'has_many:groups、:through =>:ownerships、:source =>'を試してください。それはユーザー、グループ、または投稿のいずれかですか? –

答えて

1

まずアップ:彼らは唯一のユーザーに属している必要があります場合は

belongs_to :users 

:あなたはこのようMembershipOwnershipテーブルで関連付けを定義したので、あなたが見ているそのエラーを取得していますつまり単数user

belongs_to :user 

でも、問題が発生します。

MembershipモデルとOwnershipモデルを持っていると、次はあなたのことを考えてしまうと思います。私はOwnershipモデルを持つ目的が、グループの所有権を示す以外に、テーブルのレコードのフィールド(例えば、owner)で実行できるかどうか分かりません。オーバーエンジニアリングです。

あなたが持っているRailsコードの問題は、あなたが1つの関連付けを介して多くの投稿を持っていることを定義し、次に別の関連付けを介して多くの投稿をしているということです。実際には、次のようにしています。

ここでは、2つの同じ名前のメソッドがあります。これはです。正確には同じ名前の2つの関連付けを定義して何をしているのですか?

Membershipというモデルを持っている理由が、madnessへのパスであることが分かりました。

実際には、グループの所有者を宣言するブール値属性を持つMembershipモデルを使用することをお勧めします。これはまた、あなたが望むならば、グループのための新しい所有者を非常に簡単な方法で持つことができることを意味します:ブール値を反転します。 別のレコードを別のテーブルに作成する必要はありません。

Membershipこれらをすべて統治するモデル。

+0

こんにちは、ライアン!私は狂気のリンクが好きだった:)。説明とエラーの原因を見つけることに感謝します。私はあなたのアドバイスを考慮に入れます。一般的に、分離の最初の目的は、将来、別々のテーブルに所有者とメンバーのプロパティを保持することでした。 –

関連する問題