Rails - 反馈循环模型 - 用户为“评估者”和“可评估者”

时间:2016-05-29 23:44:26

标签: ruby-on-rails polymorphism polymorphic-associations

我对在Rails 4应用程序中实现反馈循环的尝试感到困惑。

我在这里提出了与此问题相关的问题:

Evaluation - polymorphic associations on feedback loop

我仍在试图找出一般方法 - 以及这些问题的解决方案,但我遇到的具体问题是如何根据与用户的关联设置模型。

我正在尝试销毁我的rails控制台中的所有用户,但是我会因为错误而停止:

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添加到用户,因为我的模型上已有用户。

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

2 个答案:

答案 0 :(得分:0)

根据其他帖子,您的评估模型都属于Evaluator和Evaluatable。但是你的表似乎没有Evaluator的外键......你应该创建一个迁移,使“引用”给Evaluator

答案 1 :(得分: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

或者,如果您确实要分离EvaluatorEvaluatee的功能,则可以创建单独的类,这两个类都访问相同的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)

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