2015-12-31 54 views
0

現在,我試圖在測驗結束時顯示所有用戶在特定測驗中得分情況的記分板。要做到這一點,我打電話索引和顯示的用戶名,類別和評分:從Ruby on Rails中的表中調用特定對象

<% @participations.each_with_index do |participation, index| %> 
    <tr> 
     <td>#<%= index + 1 %></td> 
     <td><%= participation.user.username %></td> 
     <td><%= participation.category %></td> 
     <td><%= participation.score %></td> 
    </tr> 
    <% end %> 

通過調用雖然指數,它顯示在參與模型中的所有得分。例如,如果我有三個測驗類別:歷史,體育和商業,它將顯示此表中所有三個類別的分數。

爲了解決這個問題,我相信我需要調用一個特定的對象 - 在本例中是「歷史記錄」類別列 - 以過濾記分板表以獲得該測驗的分數。這可能通過改變索引查詢?

側面說明:參股表看起來像這樣在遷移後:

class CreateParticipations < ActiveRecord::Migration 
    def change 
     create_table :participations do |t| 
     t.references :user 
     t.string :category 
     t.boolean :finished, default: false 
     t.integer :current_question_index, default: 0 
     t.integer :score, default: 0 
     t.timestamps 
    end 
    end 
end 

記分牌控制器:

class ScoreboardController < ApplicationController 
    def index 
    @participations = Participation.where(finished: true).order(score: :desc) 
     end 
    end 
+0

請用相關的控制器代碼更新問題。假設您通過url參數中的類別 – Kkulikovskis

+0

Good catch @Kkulikovskis,請嘗試將控制器代碼更改爲'@participations = Participation.where(category:params [:category])'。用控制器代碼更新op。 – darkginger

回答

1

簡單的答案是,你打電話全部表的值爲participations。你需要過濾查詢只返回你想要的category值:

@participations = Participation.where(finished: true, category: "history").order(score: :desc) 

一個好辦法做到這一點是使用下列內容:

#config/routes.rb 
resources :scoreboards do 
    get ":category", to: :index, on: :collection #-> url.com/scoreboards/history 
end 

這將允許你使用:

#app/controllers/scoreboards_controller.rb 
class ScoreboardsController < ApplicationController 
    def index 
     if params[:category] 
     @participations = Participation.where(finished: true, category: params[:category]).order(score: :desc) 
     else 
     @participations = Participation.where(finished: true).order(score: :desc) 
     end 
    end 
end 

一個親提示這裏是使用enumcategories

#app/models/participation.rb 
class Participation < ActiveRecord::Base 
    enum category: [:history, :sports, :business] 
end 

你必須改變你的表有一個整數category

change_column :participations, :category, :integer, default: 0 

enum將存儲整數每個定義的類別。如果你閱讀文檔,你會看到它的有效程度(允許你加載各種實例方法等)。

最重要的是,它會幹掉你的數據庫 - 允許你存儲不同類別的數字,使你的程序更高效,並最終讓你更加一致地擴展它。

+1

這對於該項目非常有效,我們現在正在正確篩選類別。謝謝。 – darkginger

0
 class ScoreboardController < ApplicationController 
     def index 
     if params[:category].present? 
      @participations = Participation.where(finished: true, params[:category]).order(score: :desc) 
     else 
      @participations = Participation.where(finished: true).order(score: :desc) 
     end 
     end 
    end 

然後在URL就可以有一個像指數類別=歷史過濾器?