评估 – 反馈回路的多态关联

我正试图弄清楚如何在我的Rails 4应用程序中实现评估模型。

我之前已经问过这些相关的问题,但我还没有解决这个问题:

Rails 4多态关联和关注点

Rails 4 – 完成后评估模型 – 结构

我有:

class Evaluation  true belongs_to :evaluatable, :polymorphic => true 

我也对评估者提出了关注并且可以评估为:

 module Evaluator extend ActiveSupport::Concern included do has_many :given_evaluations, as: :evaluator, dependent: :destroy, class_name: 'Evaluation' end end module Evaluatable extend ActiveSupport::Concern included do has_many :received_evaluations, as: :evaluatable, dependent: :destroy, class_name: 'Evaluation' end end 

我在用户模型中包含了每个问题:

 class User < ActiveRecord::Base include Evaluator include Evaluatable 

在我的展示页面中,我想展示特定用户的评估(从其他用户 – 他们是评估者)收到。

在我的节目中,我有:

  

在我的评估表中,我不确定如何指定评估的接收者。我已经制作了基本表格,但我不清楚如何将其与应该接受评估的用户联系起来。

   
"How do you rate this experience (1 being did not meet expectations - 10 being met all expectations) ?" %> "Evaluate your project experience", :input_html => {:rows => 10} %>

我的评估表有:

  t.integer "user_id" t.integer "evaluatable_id" t.string "evaluatable_type" t.integer "overall_score" t.integer "project_score" t.integer "personal_score" t.text "remark" t.boolean "work_again?" t.boolean "continue_project?" t.datetime "created_at", null: false t.datetime "updated_at", null: false end add_index "evaluations", ["evaluatable_type", "evaluatable_id"], name: "index_evaluations_on_evaluatable_type_and_evaluatable_id", unique: true, using: :btree 

在我的用户控制器中,我有:

 def show # authorize! :read, @user @received_evaluations = @user.received_evaluations end 

我目前收到的错误是:

 undefined method `received_evaluations' for # 

我不确定这条消息的含义或解决方法。

如果我将节目改为:

  

我收到此错误:

 undefined method `received_evaluations' for nil:NilClass 

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

基于上述逻辑,不需要使用多态关联。 他们可能会为你复杂化。

这是我认为你需要的:

 class User has_many :given_evaluations, foreign_key: :evaluator_id, class_name: Evaluation has_many :received_evaluations, foreign_key: :evaluatee_id, class_name: Evaluation end class Evaluation 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模块。

所以,现在要显示用户收到的评估并删除您收到的错误消息:

在控制器中:

 # ensure we get the user for all relevant routes before_filter :get_user, only: [:show, edit, :update, :destroy] def get_user @user = User.find(params[:id]) end def show # get the received evaluations and order @received_evaluations = @user.received_evaluations @received_evaluations = @received_evaluations.order('created_at DESC') # you will probably want grab the evaluator record as well... @received_evaluations = @received_evaluations.includes(:evaluator) end 

并在展示视图中

 <% @received_evaluations.each do |eval| %> 
<%= eval.remark %> <%= eval.personal_score %> <%= eval.created_at %> ...
<% end %>