2016-05-29 1 views
1

J'essaie de comprendre comment implémenter un modèle d'évaluation dans mon application Rails 4.Évaluation - associations polymorphes sur la boucle de rétroaction

Je l'ai déjà posé ces questions liées, mais je suis encore à résoudre ce problème:

Rails 4 Polymorphic associations and concerns

Rails 4 - post completion evaluations model - structure

Je:

class Evaluation < ActiveRecord::Base 

    belongs_to :evaluator, :polymorphic => true 
    belongs_to :evaluatable, :polymorphic => true 

J'ai aussi fait des préoccupations pour évaluateur et évaluable en tant que:

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 

J'ai inclus chaque préoccupation dans mon modèle d'utilisateur:

class User < ActiveRecord::Base 
    include Evaluator 
    include Evaluatable 

Dans ma page show, je veux montrer une des évaluations d'un utilisateur particulier (reçues d'autres utilisateurs -Qui sont évaluateurs).

Dans mon show, j'ai.

<% Evaluation.find(params[:id]).received_evaluations.order('created_at DESC').each do |eval| %> 
           <div id="portfolioFiltering" class="masonry-wrapper row"> 
             <%= eval.remark %> 
             <%= eval.personal_score %> 
             <small><%= eval.created_at %></small> 

Dans ma forme d'évaluations, je "ne suis pas sûr de savoir comment désigner le destinataire de l'évaluation que je l'ai fait la forme de base, mais je ne suis pas clair . sur la façon de l'attacher à l'utilisateur qui doit recevoir l'évaluation

<%= simple_form_for(@evaluation) do |f| %> 
    <%= f.error_notification %> 

    <div class="form-inputs"> 
    <%= f.input :score, collection: 1..10, autofocus: true, :label => "How do you rate this experience (1 being did not meet expectations - 10 being met all expectations) ?" %> 

    <%= f.input :remark, as: :text, :label => "Evaluate your project experience", :input_html => {:rows => 10} %> 

Ma table évaluations a:

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 

Dans mon contrôleur utilisateurs, j'ai:

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

Je reçois actuellement une erreur qui dit:

undefined method `received_evaluations' for #<Evaluation:0x007fb8c4b32160> 

Je ne sais pas ce que signifie ce message ou comment le résoudre.

Si je change le spectacle:

<% @user.received_evaluations.each do |eval| %> 

Je reçois cette erreur:

undefined method `received_evaluations' for nil:NilClass 

Répondre

0

Lecture de vos différentes questions à ce sujet, je pense que ce sont essaient de mettre en place un mécanisme pour un User pour évaluer un autre User.

Selon la logique ci-dessus, l'utilisation d'associations polymorphes n'est pas requise. Ils compliquent probablement les choses pour vous.

C'est ce que je pense que vous avez besoin:

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 

Votre table d'évaluation serait comme ceci:

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 

Vous pouvez en finir avec les modules Evaluator et Evaluatable.

Donc, maintenant pour afficher les évaluations reçues d'un utilisateur et de se débarrasser des messages d'erreur que vous recevez:

Dans le contrôleur:

# 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 

Et dans le montrent vue

<% @received_evaluations.each do |eval| %> 
    <div id="portfolioFiltering" class="masonry-wrapper row"> 
    <%= eval.remark %> 
    <%= eval.personal_score %> 
    <small><%= eval.created_at %></small> 
    ... 
    </div> 
<% end %> 
+0

Lorsque j'essaie cela, je crée une nouvelle évaluation et j'obtiens une erreur qui indique: Impossible de trouver l'utilisateur avec 'id' = 3. Chaque fois que j'en fais un nouveau, le nombre augmente de 1. Je ne pense pas que ce sont des identifiants d'utilisateur, mais plutôt des identifiants d'évaluation. Je ne suis pas sûr de ce qui ne va pas ici. – Mel

+0

les actions ci-dessus sont dans le contrôleur d'évaluation. Dois-je ajouter quelque chose au contrôleur des utilisateurs pour que cela fonctionne? – Mel