【问题标题】:Rails - Feedback loop models - user as "evaluator" and "evalutable"Rails - 反馈循环模型 - 用户作为“评估者”和“可评估者”
【发布时间】:2016-05-29 23:44:26
【问题描述】:

我对在我的 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

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

谁能看到我应该做些什么来解决这个问题?

【问题讨论】:

  • 您在此处提供的表/模型是什么?

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    阅读您对此问题的不同问题,我认为您正在尝试为一个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)
    

    这种方法的注意事项是,评估记录的依赖销毁变得有点困难,因为关联被拆分为两个独立的模型。

    【讨论】:

    • 嗨布伦特,我想我尝试这种方法是因为我希望学生参与小组项目,然后互相留下反馈。评价属于项目,属于用户。您建议的方法是否意味着我无法将反馈分配给项目以及用户?
    • 只是为了确认一下,你能澄清一下学生在评估什么吗?他们是为项目本身提供反馈,还是为项目的个别成员提供反馈,或两者兼而有之?
    • 其他学生和项目。对于项目,他们回答诸如“continue_project?”之类的问题。如果他们想继续努力。大多数问题是其他参与者的反馈
    • 好的,然后只关注User 模型上的given_evaluations 关系和Evaluation 模型上的evaluator 关联。正如我在回答中所做的那样,需要定义 foreign_keyclass_name 的其他选项来修复您遇到的特定错误。
    • 非常感谢。我现在正在尝试。
    猜你喜欢
    • 2019-10-22
    • 2021-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-24
    • 2010-11-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多