2011-05-23 89 views
3
class Profile 
    has_many :projects, :through => "teamss" 
    has_many :teams, :foreign_key => "member_id" 
    has_many :own_projects, :class_name => "Project", :foreign_key => :profile_id 
    has_many :own_teams, :through => :own_projects, :source => :teams 
end 

class Project 
    belongs_to :profile, :class_name => "Profile" 
    has_many :teams 
    has_many :members, :class_name => "Profile", :through => "teams", :foreign_key => "member_id" 
end 

class Team 
    belongs_to :member, :class_name => 'Profile' 
    belongs_to :project 
end 

我需要创建模型Evaluation。我想要做的是在project#view页面为每个项目成员(包括所有者)生成一个链接,以便制作一个Evaluation此人将点击链接并评估与此链接相关的人员。 Project的所有者将评估所有成员,所有成员将评估所有者。帮助在Rails中建立模型

我已经定义模式Evaluation如下,但我想我错过了什么:

class Evaluations < ActiveRecord::Base 
    belongs_to :evaluated, :class_name => 'Profile', :foreign_key => "evaluated_id" 
    belongs_to: :profile, :class_name => 'Profile', :foreign_key => "profile_id" 
end 

记住,Evaluation表将有万吨的属性,这就是为什么我会不has_many_and_belongs_to_many去。

如何创建此模型以便做我想做的事,并且能够通过project#show页面获取我需要的所有内容?

谢谢!

编辑

变化做:

class Profile 
    has_many :evaluations, :dependent => :destroy, :foreign_key => :evaluation_id 
    has_many :evaluators, :through => :evaluations, :foreign_key => :profile_id 
end 

class Project 
    has_many :evaluations,:foreign_key => "project_id" 
end 

class Evaluations < ActiveRecord::Base 
    belongs_to :evaluated, :class_name => 'Profile', :foreign_key => "evaluated_id" 
    belongs_to: :profile, :class_name => 'Profile', :foreign_key => "profile_id" 
    belongs_to: :project, :class_name => 'Project', :foreign_key => "project_id" 
end 
+0

是为配置文件所附的每个项目创建的新评估吗?如果是这样,似乎评估应该'belongs_to:project' – 2011-05-23 23:36:47

+0

项目整体就像一个连接器。例如:我评估了Project X的所有者,因为我是Project X的成员。但由于评估链接将在'project#show'中,所以我想你可能是对的。 – Luk 2011-05-23 23:39:16

回答

0

你有你的团队和个人资料(会员)协会有点混乱。一个团队有许多配置文件(成员),一个配置文件(成员)属于一个团队。除此之外,你可能只是过分复杂的事情。我很好奇你为什么不直接打电话给Profile Model Member并让事情变得简单些?

这就是说,你正在做一个相当复杂的一组关联。我强烈建议您仔细阅读ActiveRecord Associations doc以深入了解这些事情的工作方式,特别是如何自动确定主键和外键。

我想下面会给你你想要的。

class Team 
    has_and_belongs_to_many :members, 
    :class_name => "Profile" 
    belongs_to :project 
    belongs_to :team_leader, 
    :class_name => "Profile" 
end 

class Profile 
    has_and_belongs_to_many :teams 
    has_many :projects, 
    :through => :teams 
    has_many :owned_projects, 
    :class_name => "Project", 
    :foreign_key => "owner_id" 
    has_many :owned_teams, 
    :class_name => "Team", 
    :foreign_key => "team_leader_id" 
    has_many :evaluations 
    has_many :evaluations_given, 
    :class_name => "Evaluation", 
    :foreign_key => "evaluator_id" 
end 

class Project 
    has_many :teams 
    belongs_to :owner, 
    :class_name => "Profile" 
    has_many :members, 
    :through => :teams 
    has_many :evaluations 
end 

class Evaluation 
    belongs_to :profile 
    belongs_to :evaluator, 
    :class_name => "Profile", 
    :foreign_key => "evaluator_id" 
    belongs_to :project 
end 

为了支持这些模型定义将是下表/键:

evaluation 
    id 
    profile_id 
    evaluator_id 
    project_id 

teams 
    id 
    project_id 
    team_leader_id 

profiles 
    id 

project 
    id 
    owner_id 

profiles_teams 
    profile_id 
    team_id 

有了这个,你应该能够访问的集合/,你需要得到正确的链接,如对象:

  • project.members

    project.owner

    project.teams

    team.project

    profile.projects

    profile.owned_projects

    profile.teams

    team.members

    队。领导

    project.evaluations

    profile.evaluations

    evaluation.evaluator

    profile.evaluations_given

另请注意,您嵌套资源将是同样复杂,如果您尝试留在RESTFUL框架。阅读!