评估 – 反馈回路的多态关联
我正试图弄清楚如何在我的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
然后,您可以取消Evaluator
和Evaluatable
模块。
所以,现在要显示用户收到的评估并删除您收到的错误消息:
在控制器中:
# 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 %>