[英]Rails 3, has_many :through and :polymorphic - Should I need to do this?
好的,所以这里。 我不知道我是否过于复杂化,或者我是否仍然对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 = ...
因此,在写下来时,我可以看到我对这个模型的理解存在另一个差距。 用户可以拥有所有者,追随者或贡献者的角色或这三者的任意组合。
在实际代码方面,我在这里添加了我认为的相关部分:
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
我觉得我在荒野中真的得到了我想要的东西,也许依靠神奇的铁轨来做更多的事情。 任何关于最佳路径的指导都将不胜感激。
提前致谢
史蒂夫
Rails可以做很多事情,但我认为你试图让关系模型做得太多。 每一种都是不同的关系,所以我想尽量保持这种关系。
将其拆分为单独的连接模型:
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个Model以相同的方式与任意数量的其他模型相关时。 这不是这种情况,因为你有2个模型,它们之间有3种不同类型的关系。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.