2014-10-10 64 views
0

我經常需要存儲一個常量。符號可以很好地定義常量類型,但我不知道如何在Rails模型中定義它們。我會創建一個單獨的模型來存儲類型。例如,我有一個具有status屬性的Game模型。如何在Rails 4模型中存儲符號?

class Game < ActiveRecord::Base 
    has_one :status 
end 

status屬性是與稱爲Status另一個模型的關聯。 status表有四行,每行定義一個不同的status,並且每個status都有一個名稱屬性,它是一個字符串。

def change 
    create_table :statuses do |t| 
    t.belongs_to :game 
    t.timestamps 
    end 
end 

但這感覺效率低下和錯誤。理想情況下,我可以在Game表中存儲一個符號/常數列。那可能嗎?

回答

2

您的遊戲狀態可以被認爲是枚舉類型。我非常喜歡將它們作爲記錄存儲在單獨的數據庫表中。這使得他們很容易重命名和遷移,同時保持數據的完整性。

您可能還想嘗試Rails 4.1新增的「枚舉」功能。您可以簡單地聲明如下內容

class Game 
    enum :status => %w[Init Pause Play End] 
end 

請注意,您需要添加一個類型爲「status」的列以支持此操作。

更多嘗試閱讀 http://robots.thoughtbot.com/whats-new-in-edge-rails-active-record-enum http://richonrails.com/articles/active-record-enums-in-ruby-on-rails-4-1

1

我會創建一組常量來表示可能的狀態範圍。這些將作爲整數存儲在數據庫中。這些整數可以與Game :: Over進行比較,例如在代碼中。

class Game 
    NotStarted = 0 
    InPlay  = 1 
    Over  = 2 

    ... 
end 

puts "let's get started!" if Game.find(id).status == Game::NotStarted 
+0

謝謝,這看起來很簡單! – BeachRunnerFred 2014-10-10 02:18:26

+0

是否有效?我期待着'NOT_STARTED'等。 – juanpastas 2014-10-10 04:29:20

+0

我想要一個選項,你有一個數組或散列,它往往是有用的,這樣 – juanpastas 2014-10-10 04:30:39