2011-01-26 30 views
4

鑑於我有一個模型house和它生活過好幾個州,這樣的事情: Dreaming —> Planning —> Building —> Living —> Tearing down的Rails:訂購狀態數據庫

如果我想找回假設從DATABSE,並責令其十家屋國家領域,我得到第一個所有房屋在Building狀態,然後Dreaming,然後Living,...

是否有可能由國家在爲了從數據庫中獲取,責令所有房屋意圖之前檢索他們?意思是,首先所有的房屋在Dreaming狀態,然後Planning等。通過在數組中提供排序來比較排序。

我想避免在獲取所有條目後以ruby方式執行此操作,以及我不想爲狀態使用ID。

UPDATE

上枚舉實現閱讀後,我想,如果我可以做它的工作,我會盡力的enum column pluginstate_machine plugin相結合,實現我後。如果有人以前做過這樣的事情(特別是Rails 3下的組合),我會很感激!

回答

3

如果你正在使用MySQL,那麼解決的辦法是做ORDER BY FIELD(州, '大廈', '夢', '生活',...):

House.order("FIELD(state, 'Building', 'Dreaming', 'Living', ...)") 
+0

謝謝!沒有獨立於數據庫的方式來使用這個功能,是嗎? – polarblau 2011-01-26 08:36:59

+0

那麼,你可以使用case/when/else來代替 - 它可以在MySQL和Postrgesql中使用http://stackoverflow.com/questions/1309624/simulating-mysqls-order-by-field-in-postgresql – psyho 2011-01-26 10:06:45

2

如果你想按照某個標準對收集進行排序後,您必須在某處存儲該標準。

我不知道這是否違背了你的「不紅寶石」標準,但我可能會做這樣的事情:

class House < ActiveRecord::Base 
    STATES { 0 => "Dreaming", 
      1 => "Planning", 
      2 => "Building", 
      3 => "Living", 
      4 => "Tearing Down" } 

    validates_inclusion_of :state, :in => STATES.keys 

    def state_name 
    STATES[self.state] 
    end 
end 

@houses = House.order("state") 

在這種情況下,數據庫字段狀態是一個整數,而不是字符串。它使數據庫存儲和查詢非常有效。

然後在您的視圖中,您可以調用state_name從存儲在模型中的STATES哈希中獲取正確的名稱。通過使用標籤而不是散列中的字符串,也可以將其更改爲使用i18n本地化。

+0

感謝您的回答。不過,這就是我的字段ID。我希望能夠使用州名作爲字符串用於此目的。 – polarblau 2011-01-26 08:39:30