我对在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添加到用户,因为我的模型上已有用户。
任何人都可以看到我应该做些什么来解决这个问题吗?
答案 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
然后,您可以取消使用Evaluator
和Evaluatable
模块。
鉴于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
和Evaluatee
的功能,则可以创建单独的类,这两个类都访问相同的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)
这种方法的警告是,评估记录的依赖性破坏变得有点困难,因为这种关联分为两个单独的模型。