1

以下の関係で、特定のユーザーのすべての投稿を抽出しようとしています。それらが正しいかどうかわからないので、よりよく説明します。ユーザーは、いくつかのグループで所有権とメンバーシップを持っています。ユーザーは、グループのメンバーまたは所有者のいずれかになることができますが、両方になることはできません。すべての投稿には、ユーザーとグループの ID があります。問題は以下の関係によるものだと思います。どうすれば回避できますか?もう一つ。ユーザーのグループ内の他のユーザーによって投稿されたすべての投稿も検索する必要があります。つまり、グループを通過する必要があります。

       /-- 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

次のようなエラー:

モデルの所有権でソースの関連付け :user が見つかりませんでした。'has_many :groups, :through => :ownerships, :source => ' を試してください。:users、:groups、または :postings のいずれかですか?

4

1 に答える 1

1

Membership最初に、次のようにandOwnershipテーブルで関連付けを定義したため、表示されているエラーが発生しています。

belongs_to :users

それらが 1 人のユーザーのみに属する必要がある場合 (つまり、singular の場合) user:

belongs_to :user

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

Membershipモデルとモデルを持つことは、Ownership次にあなたをつまずかせるものだと思います. たとえば、テーブルのレコードのOwnershipフィールドによって実行できるグループの所有権を示す以外に、モデルを使用する目的が何を提供するのかわかりません。オーバーエンジニアリングです。membershipsowner

そこにあるRailsコードの問題は、ある関連付けを通じて多くの投稿があることを定義していて、別の関連付けを通じて多くの投稿があることを伝えていることです。実際には、これを行っています:

 def posts
   # find posts for the groups that I own
 end

 def posts
   # find posts for the groups I belong to
 end

ここで、同じ名前のメソッドが 2 つあるのは間違いではありません。これはまさにhas_many、同じ名前の2 つの関連付けを定義することによって行っていることです。

Ownershipこれで、Membershipモデルを持つことが狂気への道である理由がわかると思います。

Membershipグループの所有者を宣言するブール属性を持つモデルを用意することを強くお勧めします。これは、必要に応じて、ブール値を反転するだけで、非常に簡単な方法でグループの新しい所有者を持つことができることも意味します。別のテーブルに別のレコードを作成する必要はありません。

それらすべてを支配する1 つのMembershipモデル。

于 2011-09-12T23:20:17.820 に答える