2016-04-04 28 views
8

Tôi đang cố gắng thêm một mô hình Evaluation vào ứng dụng Rails 4 của mình.Rails 4 Các mối quan hệ và mối quan hệ đa hình

Tôi đã tạo mô hình có tên là evaluation.rb. Nó có:

class Evaluation < ActiveRecord::Base 

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

tôi cũng đã thực hiện những lo ngại cho evaluatorevaluatable như:

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 

Tôi đã bao gồm mỗi mối quan tâm trong mô hình của tôi sử dụng:

class User < ActiveRecord::Base 
    include Evaluator 
    include Evaluatable 

Trong trang chương trình của tôi, Tôi muốn hiển thị một đánh giá của người dùng cụ thể (nhận được từ những người dùng khác -những người đánh giá).

Trong chương trình của tôi, tôi có:.

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

Ở dạng đánh giá của tôi, tôi "không chắc chắn làm thế nào để chỉ định người nhận đánh giá tôi đã thực hiện các hình thức cơ bản, nhưng tôi không rõ ràng . về làm thế nào để buộc nó vào người dùng sẽ nhận được đánh giá

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

bảng đánh giá của tôi có:

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 

CÂU HỎI

Làm cách nào để thiết lập trang hiển thị để hiển thị các đánh giá của người dùng đã nhận?

Làm cách nào để điều chỉnh biểu mẫu để chỉ định id người dùng là người sẽ nhận được đánh giá?

+0

Câu hỏi hay và bạn giỏi giải thích vấn đề của mình .. hãy xem liệu có ai giúp – illusionist

+0

Bạn có định sử dụng 'Đánh giá' để đánh giá các đối tượng không phải là người dùng không? Dựa trên câu trả lời của bạn, câu trả lời có thể được đơn giản hóa. –

+0

Có. tôi muốn đánh giá các dự án mà người dùng thực hiện – Mel

Trả lời

2

Làm cách nào để thiết lập trang hiển thị để hiển thị các đánh giá của người dùng đã nhận?

Các mối quan tâm về mô hình của bạn sẽ giúp bạn điều đó. Trong hành động UsersController#show bạn, chỉ cần bổ sung thêm những điều sau đây nên làm như lừa:

@received_evaluations = @user.received_evaluations 

Sau đó, bạn có thể sử dụng nó trong chương trình mẫu của bạn:

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

Hoặc sử dụng collection rendering.

lưu ý: Evaluation.find(...) hiện đang ở chế độ xem của bạn phải được đặt trong hành động của bộ điều khiển, không nên thực hiện điều đó trong chế độ xem.

Làm cách nào để điều chỉnh biểu mẫu để chỉ định id người dùng là người sẽ nhận được đánh giá?

Nếu bạn đã xác định người dùng sẽ là evaluatable, bạn có thể đặt nó trong hành động điều khiển hoặc trong biểu mẫu xem trong trường hợp bạn có danh sách người dùng đánh giá trên trang của mình.

Trong bộ điều khiển:

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

Hoặc tuyên bố đơn giản này nên làm như vậy:

@evaluation.evaluatable = user_to_evaluate 

Tương tự như vậy, bạn sẽ có thể thiết lập các đánh giá theo cùng một cách:

@evaluation.evaluator = user_that_evaluates 

Trong chế độ xem:

<% @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

được rồi !! Cảm ơn Marc rất nhiều. Tôi sẽ thử nó tối nay. – Mel

Các vấn đề liên quan