如何建立評分表


#1

目前做個網站讓人放東西上去,想要列出每人的作品然後會有好幾個人來評分。我有建立表格並列出所有人的東西,可是填完之後只存最後一個資料…不知要怎麼來實現。


#2

把…你詳細的需求列出來,把問題描述清楚,否則沒有人可以幫你解…,類似

  1. 每個人可以有自己的作品,且可以有多個作品
  2. 每個人可以評分別人的作品,一個作品只能評分一次
  3. 可以顯示作品的評分等級,並用分數來做排序

anyway 你的需求不明確,所以不知道該如何分析下去,& 光是評分的方式就有 N 種以上,評分後的東西表現也有 M 種以上,沒頭沒尾的請詳述哩


#3

抱歉,第一次做不知道有那麼多種做法。
需求就像JC所列的第二種,評分別人作品而且只能評分一次這樣,由特定的人來評分。就像是有3個人來給10個作品打分數。每個作品都會有評審A、評審B跟評審C的分數,最後由admin輸出這作品的分數成excel或pdf的分數表出來。


#4

建立三個 model,分別是 User , Item , Score

 User  [id , name(string) , is_reviewer(boolean)]
 Item  [id , user_id(integer)[原著] , name(string)]
 Score [id , user_id(integer)[評者] , item_id(integer) , level(integer) , descript(text)]

 add_index :scores , [:user_id , :item_id] , :unique => true

其中限定 is_reviewer 才能評分,或是其他判斷方式可以自己做,然後評分都存在 Score 內,附加一個 index + unique 來防止評分人對同一作品重複評分的問題

這邊沒實際code,只教你思維,類似

評分人可以選擇沒有評分過的作品來做評分的動作,儲存後建立 Score,然後點選 Item 時可以把 Score 列出來,真的沒啥點子,請先離開你的電腦,畫個流程圖釐清思緒後,就可以開 route / controller + action + view,其實就是把把流程串下去即可


#5

我把所有的作品列出來後建立成一個評分列表如下, 輸入完分數送出卻存最後一筆資料進去,要怎麼樣才能一次輸入所以資料呢?還有這樣的資料關聯是有問題的嗎??

[control]
def new
@score = current_user.scores.build
@forms = Form.all
@categories = Category.all

	end

	def create
		@form = Form.all
		@score = current_user.scores.build(score_params)
		
		if @score.save
			redirect_to @score
		else
			render 'new'
		end
         end	

[model]

  class User < ActiveRecord::Base
      has_many :forms 
      has_many :scores
    end

    class Score < ActiveRecord::Base
    	belongs_to :user
    	belongs_to :form
    	belongs_to :category
    end
    
    class Form < ActiveRecord::Base
    	belongs_to :user
    	belongs_to :category
    	has_many :scores
    end

[view]

 <%= simple_form_for @score do |f| %>

<thead>
            <tr>
                <th>No.</th>
                <th>Subject</th>
                <th>item</th>
                <th>source1</th>
                <th>source2</th>
                <th>source3</th>
                <th>total</th>
            </tr>
        </thead>
<tbody>
            <% @categories.each do |category| %>
                      <tr>
                        <% category.forms.each do |form| %>
                                <td><%= form.id %></td> #取出作品的id 
                                    <td><%= f.input :subject_name, label: false,input_html:{value: form.subject} %></td>                            td><%= link_to image_tag("doc.png",width:"40",heigh:"50"),form.doc(@url) ,target: :_blank %></td>  #點選看作品
                                     <td><%= f.input :source1,label: false,%></td>
                                    <td><%= f.input :source2, label: false, %></td>
                                    <td><%= f.input :source3, label: false, %></td>
                                    <td><%= f.input :total, label: false, %></td>
                
                       </tr>
               

            <% end %>
              <% end %>
            
   <td colspan="2"><%= f.submit '送出' ,class: "btn btn-primary"%></td>
</table>

#6

… 這邊就是自幹的重要性,如果你拋棄 Rails 的那套,你才能得到自由,請謹記,Rails 只是 HTML 產生器,ActiveRecord / relation 都是輔助,有這前提,你的問題只需要編輯出正確的 HTML,然後跑對 code 存檔即可,即使手刻也是正確,甚至還更好

首先看這邊,請先學會 params 的命名規則

再來自訂大的 form,類似使用 form_tag,而非針對單一項目的 form_for,還是那個蠢蛋一直要找解法的 simple_form,拋棄掉這些從頭開始,你才有自由|||,否則你只會困在新手迷宮內,而我都是這樣教學生,或是我們家小朋友的

<%= form_tag xxx_path do %>
  <% sources.each do |item| %>
    <!--或是自己寫html,其實就是<input type='text' name='name[]'> -->
    <%= text_field_tag 'name[]' %>
    <%= text_field_tag 'score[]' %>
    <%= text_field_tag 'total[]' %>
  <% end %>
  <button type="submit"> Submit </button>
<% end %>

送到 Ruby 內後你會得到類似這種格式

params = {
  :name  => ["name1" , "name2" , "name3"],
  :score => ["score1" , "score2" , "score3"],
  :total => ["total1" , "total2" , "total3"],
} 

之後寫個迴圈存入即可,類似

params[:name].each_with_index do |name , index|
  score = params[:score][index]
  total = params[:total][index]

    #....做你該做的,單一筆的 name , score , total 三個變數都有了,看你要 create / save / update 都可以

end

結束,在我團隊內是禁止使用 simple_form 的,且把 view 類的 gem 降到最少(甚至除非必要不準用不必要的 gem),一切都手刻,成果就是會包會用進步神速,反之,你還要查多久的 doc 呢?,以上