わかりましたので、ここに行きます。物事を複雑にしすぎているのか、それともまだ 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
私は自分が欲しいものを本当に手に入れるにはここの荒野にいるように感じます.そして多分それ以上のことをするために魔法のレールに頼っています. 最適なパスに関するガイダンスをいただければ幸いです。
前もって感謝します
スティーブ