2013-10-21 106 views
1

我想一個特定的順序對我的模型庫的數據進行排序。排序模型

Model: Grade 
Table Column: category, value 
values of category: Prelim, Midterm, Semi-finals, Finals 

我該如何對錶格進行排序,基於它的類別,其值爲「Prelim,Midterm,Semi-Finals,Finals」?

回答

4

如果你不想通過在表格中的數字來取代他們的建議:

1 = Prelim 
2 = Midterm 
3 = Semi-finals 
4 = Finals 

,然後在模型中這樣對它們進行排序通過@titibouboul。你可以做。

class Grade 
    CATEGORY_IN_ORDER = ["Prelim", "Midterm", "Semi-Finals", "Finals"] 
    scope :ordered_by_category, lambda {"order(FIELD(category,#{CATEGORY_IN_ORDER.join(',')}))"} 
end 

那麼任何地方,你可以使用這個範圍爲:

Grade.ordered_by_category.where(YOUR_CRITERIA) 

如果你不想定義範圍:

通過現場語法這裏
Grade.where(YOUR_CRITERIA).order("FIELD(category,#{CATEGORY_IN_ORDER.join(',')})")  

更多關於順序: http://www.electrictoolbox.com/mysql-order-specific-field-values/

+0

我如何使它工作on Rails的2.3 – fujisan

+0

@fujisan我不認爲這是相關的軌道版本。剛剛嘗試'Grade.where( 「類不爲空」)。爲了( 「FIELD(類別,#{CATEGORY_IN_ORDER.join( '')})」)'。它的純粹的mysql語法。 –

+0

我已經將它用作我的默認範圍。再次感謝您的解決方案。 – fujisan

0

你應該通過一些替換它們:

class Grade 
... 
default_scope -> { order('category ASC') } 
... 
end 
+0

前期,中期,半決賽和決賽是類別的價值,所以我不會放棄e現在改變它們。 – fujisan

+0

我不建議使用default_scope:http://rails-bestpractices.com/posts/806-default_scope-is-evil –

+0

default_scope已經得到了Rails中4少蹩腳,備案。 – sevenseacat