2016-05-29 58 views
1

我对我试图在Rails 4应用中实现反馈循环的尝试感到困惑。Rails - 反馈循环模型 - 用户作为“评估者”和“可评估”

我也问过有关这个问题的问题在这里:

Evaluation - polymorphic associations on feedback loop

我还在试图找出一般的方法 - 和解决这些问题,但我有一个具体问题是关于如何设置与用户关联的模型。

我试图销毁所有用户在我的轨道控制台,但是我越来越停止了与一个错误,指出:

ActiveRecord::StatementInvalid: PG::UndefinedColumn: ERROR: column evaluations.evaluator_id does not exist 

我想这意味着我需要把“evaluator_id”列在我的评估表中。

目前,该表具有:

id    :integer   not null, primary key 
    user_id   :integer 
    evaluatable_id :integer 
    evaluatable_type :string 
    overall_score  :integer 
    continue_project? :boolean 
    created_at  :datetime   not null 
    updated_at  :datetime   not null 

Indexes 

    index_evaluations_on_evaluatable_type_and_evaluatable_id (evaluatable_type,evaluatable_id) UNIQUE 

在每种情况下,评估器为用户的别名。用户也是评估的所有者。我不确定我是否真的需要将evaluateator_id添加到用户,因为我的模型上已经有用户。

任何人都可以看到我应该做些什么来解决这个问题吗?

+0

你在这里提供的是哪个表格/型号? – Maxence

+0

评价表 – Mel

回答

0

您的评估模型都属于Evaluator和Evaluatable其他职位。但是你的表格似乎没有评估者的外键...你应该创建一个迁移,使'参考'评估者

0

在这个问题上阅读你的不同问题我认为你试图建立一个机制为User评估另一个User

基于上述逻辑,不需要使用多态关联。他们可能对你来说过于复杂。

这是我觉得会适合您的需求更好地:

class User < ActiveRecord::Base 
    has_many :given_evaluations, foreign_key: :evaluator_id, dependent: :destroy, class_name: Evaluation 
    has_many :received_evaluations, foreign_key: :evaluatee_id, dependent: :destroy, class_name: Evaluation 
end 

class Evaluation < ActiveRecord::Base 
    belongs_to :evaluator, foreign_key: :evaluator_id, class_name: User 
    belongs_to :evaluatee, foreign_key: :evaluatee_id, class_name: User 
end 

你的评价表会是这样的:

id    :integer   not null, primary key 
evaluator_id  :integer   not null 
evaluatee_id  :integer   not null 
overall_score  :integer 
continue_project :boolean 
created_at  :datetime   not null 
updated_at  :datetime   not null 

然后,您可以废除的EvaluatorEvaluatable模块。

给定一个Evaluation,您可以访问及接收到的评价,像这样的User

evaluation = Evaluation.first 
evaluator = evaluation.evaluator # returns a User 
evaluatee = evaluation.evaluatee # returns a User 

,您可以访问一个用户给定的,并与收到的评价如下:

user = User.find(params[:id]) 
given_evaluations = user.given_evaluations 
received_evaluations = user.received_evaluations 

或者,如果您确实想分离出Evaluator和的功能3210你可以创建单独的类,它们都访问相同的users表。这更多的是单表继承结构。

class User 
end 

class Evaluator < User 
    has_many :evaluations 
end 

class Evaluatee < User 
    has_many :evaluations 
end 

class Evaluation < ActiveRecord::Base 
    belongs_to :evaluator 
    belongs_to :evaluatee 
end 

给定一个Evaluation,您可以访问用户,像这样:

evaluation = Evaluation.first 
evaluator = evaluation.evaluator # returns a Evaluator 
evaluatee = evaluation.evaluatee # returns a Evaluatee 

而且你可以访问用户提供下列给予和接受的评价:

user_id = params[:id] 
given_evaluations = Evaluator.find(user_id).evaluations 
received_evaluations = Evaluatee.find(user_id).evaluations 

# or 

given_evaluations = Evaluation.where(evaluator_id: user_id) 
received_evaluations = Evaluation.where(evaluatee_id: user_id) 

的警告这种方法是,评估记录的依赖性破坏变得更加困难,因为协会分为两个单独的模型。

+0

嗨布伦特,我想我尝试了这种方式,因为我希望学生参与团体项目,然后为对方留下反馈。评估属于该项目以及用户。您建议的方法是否意味着我无法将反馈分配给项目以及用户? – Mel

+0

只是为了确认,你能澄清一个学生正在评估什么吗?他们是否为项目本身提供反馈意见,或向项目的个别成员反馈意见? – br3nt

+0

另一个学生和项目。对于项目,他们回答像'continue_project?'这样的问题。如果他们想继续努力的话。大多数问题都是其他参与者的反馈 – Mel