2016-04-04 2 views
8

Я пытаюсь добавить модель Evaluation в мое приложение Rails 4.Rails 4 Полиморфные ассоциации и проблемы

Я сделал модель под названием evaluation.rb. Он имеет:

class Evaluation < ActiveRecord::Base 

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

Я также сделал проблемы для evaluator и evaluatable как:

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 

В моих шоу-странице, Я хочу показать оценки конкретного пользователя (полученные от других пользователей, которые являются оценщиками).

В моем шоу, у меня есть:.

<% Evaluation.find(params[:id]).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> 

В моей форме оценок, я "не уверен, как назначить получатель оценки я сделал основную форму, но я не ясно, . о том, как привязать его к пользователю, который должен получить оценку

<%= 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} %> 

Моя оценка таблица имеет:

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 

ВОПРОСЫ

Как настроить страницу показа, чтобы отобразить полученные оценки пользователя?

Как адаптировать форму так, чтобы она указывала идентификатор пользователя как человека, который должен получить оценку?

+0

Отличный вопрос, и вы хорошо объясняете свои проблемы .. позволяет узнать, помогает ли кто-нибудь – illusionist

+0

Вы собираетесь использовать 'Оценка 'для оценки объектов, отличных от пользователей? Основываясь на вашем ответе, ответ можно упростить. –

+0

Да. Я хочу оценить проекты, которые делают пользователи – Mel

ответ

2

Как настроить страницу показа, чтобы показать полученные оценки пользователя?

Ваши проблемы с моделью должны помочь вам в этом. В вашем UsersController#show действие, просто добавив следующие следует сделать трюк:

@received_evaluations = @user.received_evaluations 

Затем вы можете использовать его в шоу шаблона:

<% @received_evaluations.each do |evaluation| %> 
    // render some view stuff 
<% end %> 

Или используйте collection rendering.

примечание: Evaluation.find(...), который в настоящее время на ваш взгляд должен быть помещен в действие контроллера, не рекомендуется оставлять это в представлении.

Как адаптировать форму так, чтобы она указывала идентификатор пользователя как человека, который должен получить оценку?

Если вы определили пользователя, который будет служить evaluatable, вы можете установить его в действии вашего контроллера или в форме просмотра, если у вас есть список пользователей для оценки на вашей странице.

В контроллере:

@evaluation.evaluatable_id = user_to_evaluate.id 
@evaluation.evaluatable_type = user_to_evaluate.class.to_s 

Или это проще оператор должен сделать то же самое:

@evaluation.evaluatable = user_to_evaluate 

Кроме того, вы должны быть в состоянии установить оценщик таким же образом:

@evaluation.evaluator = user_that_evaluates 

На поле зрения:

<% @users_to_evaluate.each do |user| %> 
    <%= simple_form_for(Evaluation.new) 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} %> 
     <%= f.hidden_field :evaluator_id, :value => current_user.id %> 
     <%= f.hidden_field :evaluator_type, :value => current_user.class.to_s %> 
     <%= f.hidden_field :evaluatable_id, :value => user.id %> 
     <%= f.hidden_field :evaluatable_type, :value => user.class.to_s %> 
    </div> 
    <% end %> 
<% end %> 
+0

в порядке !! Большое спасибо Марку. Я попробую сегодня вечером. – Mel

Смежные вопросы