2012-05-31 28 views

回答

1

您是否考慮過在數據庫中使用內置的枚舉支持?許多常見的RDMBS具有枚舉支持,例如Postgres(請參閱http://www.postgresql.org/docs/9.1/static/datatype-enum.html)和MySQL(請參閱http://dev.mysql.com/doc/refman/5.5/en/enum.html)。有了這個,你可以直接在你的數據存儲中創建這個類型,然後通過一個ActiveRecord插件使用它(例如Postgres的enum_type:https://github.com/riscfuture/enum_type)。

另外,你可以像你所描述的那樣使用類似active_enum的結構來枚舉枚舉,並將字段作爲整數存儲在數據庫中。

+0

我居然不知道。感謝您的鏈接,我會研究它。 – Helen

6

這裏是我遵循的軌道模式:

在我的模型類,我添加了一個module舉行列的可能值。然後我將它們放入一個數組中,並根據可能值的數組定義驗證。

想象一下,我有一個名爲status的列/屬性,它可以是三個可能的值。我應該這樣做:

class MyModel < ActiveRecord::Base 

    # This validates that status can't be null 
    validates :status, :presence => true 

    # Define a module with all possible values 
    module Status 
    IN_DEVELOPMENT = 'in development' 
    DISABLED = 'disabled' 
    ACTIVE = 'active' 
    end 

    # Now create an array of possible status values, and add a validation 
    STATUSES = [ Status::DISABLED, Status::ACTIVE, Status::IN_DEVELOPMENT] 
    validates :status, :inclusion => { :in => STATUSES, :message => "%{value} is not a valid status value" } 

end 
+0

感謝Kevin,我之前嘗試過類似的方式,但是遷移不能將數組定義識別爲自定義類型。我收到一個錯誤說#無法轉儲表「hostprofiles」,因爲以下標準錯誤 #未知類型'服務'列'服務' – Helen

+0

一般來說,我發現最好暫停過去的做法,並嘗試'走鋼軌方式'在這種情況下。不可避免的是,事情變得更快,更順暢。爲什麼自定義類型如此重要?你可以使用鐵軌附帶的類型嗎? –

+0

@KevinBedell你能解釋一下這個模塊的用途還是需要的,而不僅僅是給出一組數值?我只是好奇。 –

1

取決於你打算如何使用您的代碼中該枚舉類型我發現,使用範圍實現接近同樣的事情在數據庫中的枚舉類型一起,以確保只有具體值被設置。

例子:

scope :trial, :conditions => { :utype => 'TRIAL' } 
scope :registered, :conditions => { :utype => 'REGISTERED' } 
scope :active, :conditions => { :status => 'ACTIVE' } 
scope :abuse, :conditions => { :status => 'ABUSE' }