2008-11-05 61 views
42

我有一些常量表示我的模型的一個字段中的有效選項。在Ruby中處理這些常量的最佳方式是什麼?使用Rails時,處理Ruby中常量的最佳方式是什麼?

+0

[關於枚舉在Ruby中這另一個問題似乎是非常非常相似( http://stackoverflow.com/questions/164714​​/how-can-i-use-c-style-enumerations-in-ruby) – 2008-11-05 20:46:37

回答

38

您可以使用數組或哈希爲此目的(在您的environment.rb中):

OPTIONS = ['one', 'two', 'three'] 
OPTIONS = {:one => 1, :two => 2, :three => 3} 

或者可選地枚舉c姑娘,它允許您將常數以及用於它們關聯的鍵枚舉:

class Enumeration 
    def Enumeration.add_item(key,value) 
    @hash ||= {} 
    @hash[key]=value 
    end 

    def Enumeration.const_missing(key) 
    @hash[key] 
    end 

    def Enumeration.each 
    @hash.each {|key,value| yield(key,value)} 
    end 

    def Enumeration.values 
    @hash.values || [] 
    end 

    def Enumeration.keys 
    @hash.keys || [] 
    end 

    def Enumeration.[](key) 
    @hash[key] 
    end 
end 

然後你就可以派生自:

class Values < Enumeration 
    self.add_item(:RED, '#f00') 
    self.add_item(:GREEN, '#0f0') 
    self.add_item(:BLUE, '#00f') 
end 

,並使用這樣的:

Values::RED => '#f00' 
Values::GREEN => '#0f0' 
Values::BLUE => '#00f' 

Values.keys => [:RED, :GREEN, :BLUE] 
Values.values => ['#f00', '#0f0', '#00f'] 
+2

我決定採用這個解決方案。我不得不說,它只是我想要的,並與ActiveRecord很好地搭配。謝謝!:D – Miles 2008-11-06 21:45:54

11

我把它們直接在模型類,像這樣:

class MyClass < ActiveRecord::Base 
    ACTIVE_STATUS = "active" 
    INACTIVE_STATUS = "inactive" 
    PENDING_STATUS = "pending" 
end 

然後,使用另一個類的模型時,我引用的常量

@model.status = MyClass::ACTIVE_STATUS 
@model.save 
+2

這是一種方法不是一個類。需要使用「class」而不是「def」。 – weexpectedTHIS 2012-03-23 16:53:49

5

你也可以在你的模型裏面使用像這樣的散列:


class MyModel 

    SOME_ATTR_OPTIONS = { 
    :first_option => 1, 
    :second_option => 2, 
    :third_option => 3 
    } 
end 

而且使用這樣的:



if x == MyModel::SOME_ATTR_OPTIONS[:first_option] 
    do this 
end 

+0

非常感謝。 將數組中的符號分組是一種靈感。 – chipairon 2013-04-09 08:07:40

9

如果駕駛模式的行爲,那麼常數應該是模型的一部分:

class Model < ActiveRecord::Base 
    ONE = 1 
    TWO = 2 

    validates_inclusion_of :value, :in => [ONE, TWO] 
end 

這將允許您使用內置的軌功能:

>> m=Model.new 
=> #<Model id: nil, value: nil, created_at: nil, updated_at: nil> 
>> m.valid? 
=> false 
>> m.value = 1 
=> 1 
>> m.valid? 
=> true 

另外,如果你的數據庫支持枚舉,那麼你可以使用類似Enum Column插件。

6

Rails 4.1添加了support for ActiveRecord enums

聲明一個枚舉屬性,其中值映射到數據庫中的整數,但可以按名稱查詢。

class Conversation < ActiveRecord::Base 
    enum status: [ :active, :archived ] 
end 

conversation.archived! 
conversation.active? # => false 
conversation.status # => "archived" 

Conversation.archived # => Relation for all archived Conversations 

請參閱its documentation瞭解詳細信息。

+0

我認爲這是最好的答案。 – 2015-09-16 19:42:28

0

您也可以組常數爲主體,使用一個模塊 -

class Runner < ApplicationRecord 
    module RUN_TYPES 
     SYNC = 0 
     ASYNC = 1 
    end 
end 

再有,

> Runner::RUN_TYPES::SYNC 
=> 0 
> Runner::RUN_TYPES::ASYNC 
=> 1 
相關問題