0

わかりましたので、ここに行きます。物事を複雑にしすぎているのか、それともまだ Rails に慣れていないために基本を理解していないだけなのかはわかりません。私がsudoコードで欲しいのはこれです:

User
has_many projects as owner through relationship
has_many projects as contributor through relationship
has_many projects as follower through relationship

Project
has_one user as owner through relationship
has_many users as followers through relationship
has_many users as contributors through relationship

Relationship
belongs_to user
belongs_to project

次に、次の魔法のものが欲しいです。

owner = Project.owner
followers = Project.followers
contributors = Project.contributors

projects = User.projects
myprojects = User.projects... (now I'm really not sure)
followedProjects = ...
contributingProjects = ...

それを書き留めてみると、このモデルに対する私の理解には別のギャップがあることがわかります。ユーザーは、所有者、フォロワー、寄稿者、または 3 つすべての組み合わせの役割を持つことができます。

実際のコードに関しては、関連する部分だと思うものをここに追加しました。

class User < ActiveRecord::Base
  has_many :user_project_relationships, :as => :relateable, :class_name => "UserProjectRelationship"
  has_many :projects, :as => :owner, :through => :relateable, :class_name => "Project", :source_type => :owner
  has_many :projects, :as => :follower, :through => :relateable, :class_name => "Project", :source_type => :follower
  has_many :projects, :as => :contributor, :through => :relateable, :class_name => "Project", :source_type => :contributor
end

class Project < ActiveRecord::Base
  has_many :user_project_relationships, :as => :relateable, :class_name => "UserProjectRelationship"
  has_one :user, :as => :owner, :through => :relateable, :class_name => "User"
  has_many :users, :as => :followers, :through => :relateable, :source_type => :follower, :class_name => "User"
  has_many :users, :as => :contributors, :through => :relateable, :source_type => :contributor, :class_name => "User"
end

class UserProjectRelationship < ActiveRecord::Base
  belongs_to :user
  belongs_to :project, :polymorphic => true
end

リレーションシップ モデルの移行は次のとおりです。

class CreateUserProjectRelationships < ActiveRecord::Migration
  def self.up
    create_table :user_project_relationships do |t|
      t.integer :relateable_id
      t.string :relateable_type
      t.integer :project_id
      t.timestamps
    end
    add_index :user_project_relationships, [:relateable_id, :relateable_type], :name => :relateable
    add_index :user_project_relationships, :project_id
  end

  def self.down
    drop_table :user_project_relationships
  end
end

現在、project.users などのエラーが発生しますActiveRecord::HasManyThroughAssociationNotFoundError: Could not find the association :relateable in model Project

私は自分が欲しいものを本当に手に入れるにはここの荒野にいるように感じます.そして多分それ以上のことをするために魔法のレールに頼っています. 最適なパスに関するガイダンスをいただければ幸いです。

前もって感謝します

スティーブ

4

1 に答える 1

2

Rails は多くのことを実行できますが、代わりに Relationship モデルに多くのことをさせようとしていると思います。それぞれの関係性が違うので、それを維持するように心がけていると思います。

それを別々の結合モデルに分割します。

class User < ActiveRecord::Base

  has_many :owned_projects, :class_name => "Project", :foreign_key => :owner_id

  has_many :projects_followers
  has_many :followed_projects, :class_name => "Project", :through => :projects_followers

  has_many :projects_contributors
  has_many :contributed_projects, :class_name => "Project", :through => :projects_contributors

end

class Project < ActiveRecord::Base
  belongs_to :owner

  has_many :projects_followers
  has_many :followers, :class_name => "User", :through => :projects_followers


  has_many :projects_contributors, :foreign_key => :contributor_id
  has_many :contributors, :class_name => "User", :through => :projects_contributors

end

class ProjectsFollowers < ActiveRecord::Base
  belongs_to :user
  belongs_to :project
end

class ProjectsContributors < ActiveRecord::Base
  belongs_to :user
  belongs_to :project
end

あなたが望むものにずっと近いはずです。その後、実際に行うことができます

project.owner
project.followers
project.contributors

user.owned_projects
user.followed_projects
user.contributed_projects

それはうまくいくか、かなり近づくはずです。

あなたの混乱は、多態的な関係を作ろうとしたことが原因だと思いますが、これはここでは望ましくないと思います。AFAI grok、ポリモーフィックな関係の使用例は、1 つのモデルを同じ方法で任意の数の他のモデルに関連付けたい場合です。ここでは、3 つの異なるタイプの関係を持つ 2 つのモデルがあるため、これは当てはまりません。

于 2011-06-20T01:03:16.587 に答える