2013-11-14 31 views
1

創建一個枚舉類型,默認爲一個特定值我有一個模型如何爲新對象

class Transaction < ActiveRecord::Base 

end 

我有一個TRANSACTION_TYPE列是一個整數。

如何創建一個枚舉,我能值映射到名稱類似:

one_time = 1 
monthly = 2 
annually = 3 

所以在數據庫列,該值將是1,2或3

而且,只要我創建新實例或保存模型,並且該字段未設置爲:

@transaction = Transaction.new(parmas) 

它應該默認爲1(on_time)。

我不知道我該如何做到這一點?

回答

3

基本相同的答案阿米特,稍有改變控件的默認值爲

class Transaction < ActiveRecord::Base 
    before_create :set_default_for_type 

    def set_default_for_type 
    type = TransactionType.default unless type.present? 
    end 
end 

class TransactionType 
    TYPES = { 
    :one_time => 1, 
    :monthly => 2, 
    :annually => 3 
    } 

    # use to bind to select helpers in UI as needed 
    def self.options 
    TYPES.map { |item| [item[0], item[1].to_s.titleize] } 
    end 

    def self.default 
    TYPES[:one_time] 
    end 
end 

一個辦法 - 最好的辦法是隻適用於你的數據庫列的默認值並讓ActiveRecord從那裏自動獲取它

注意:它也可能是有道理的,只需要一個Transa ctionType ActiveRecord對象而不是上面的,取決於你的情況,即

# on Transaction with type_id:integer 
belongs_to :type, class_name: "TransactionType" 
1

也許你可以嘗試這樣的事情? Ruby沒有真正支持C風格的枚舉..

module TransactionType 
    ONCE = 1 
    MONTHLY = 2 
    ANUALLY = 3 
end 

,那麼你可以訪問像這樣它們的值:

@transaction = Transaction.new(TransactionType::ONCE) 
+0

我想默認爲ONCE,而不必更改我的代碼'Transaction.new'是可能的嗎? – Blankman

+0

你是否將一個散列傳遞給'Transaction.new'?如果是這樣,也許你可以添加一個'transaction_type'參數或者其他東西,然後檢查裏面的內容。如果你沒有顯式傳遞一個'transaction_type',那麼它應該默認爲'ONCE'。否則,我不這麼認爲 – yamafontes

2

您可以通過創建一個常數或是在同一Transaction模型值映射或者通過創建一個新的模塊,並把它的內部是由@KepaniHaole

解釋Transaction模型,你可以不喜歡它:

class Transaction < ActiveRecord::Base 

    TRANSACTION_TYPES = { 'one_time' => 1, 'monthly' => 2, 'monthly' => 3 } 

end 

您可以通過訪問該常數

Transaction::TRANSACTION_TYPES['one_time'] # => 1 
Transaction::TRANSACTION_TYPES['monthly']  # => 2 
Transaction::TRANSACTION_TYPES['monthly']  # => 3 

訪問這些值到默認值添加到transaction_type列只創建一個新的遷移:

def up 
    change_column :transactions, :transaction_type, :default => Transaction::TRANSACTION_TYPES['one_time'] 
end 

有了這個,每次創建時一個Transaction對象沒有通過transaction_type,默認值1被存儲在它中。