我有一些常量表示我的模型的一個字段中的有效選項。在Ruby中處理這些常量的最佳方式是什麼?使用Rails時,處理Ruby中常量的最佳方式是什麼?
回答
您可以使用數組或哈希爲此目的(在您的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']
我決定採用這個解決方案。我不得不說,它只是我想要的,並與ActiveRecord很好地搭配。謝謝!:D – Miles 2008-11-06 21:45:54
我把它們直接在模型類,像這樣:
class MyClass < ActiveRecord::Base
ACTIVE_STATUS = "active"
INACTIVE_STATUS = "inactive"
PENDING_STATUS = "pending"
end
然後,使用另一個類的模型時,我引用的常量
@model.status = MyClass::ACTIVE_STATUS
@model.save
這是一種方法不是一個類。需要使用「class」而不是「def」。 – weexpectedTHIS 2012-03-23 16:53:49
你也可以在你的模型裏面使用像這樣的散列:
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
非常感謝。 將數組中的符號分組是一種靈感。 – chipairon 2013-04-09 08:07:40
如果駕駛模式的行爲,那麼常數應該是模型的一部分:
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插件。
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瞭解詳細信息。
我認爲這是最好的答案。 – 2015-09-16 19:42:28
您也可以組常數爲主體,使用一個模塊 -
class Runner < ApplicationRecord
module RUN_TYPES
SYNC = 0
ASYNC = 1
end
end
再有,
> Runner::RUN_TYPES::SYNC
=> 0
> Runner::RUN_TYPES::ASYNC
=> 1
- 1. 在Ruby on Rails中處理沒有ID錯誤的最佳方式是什麼?
- 2. 在Perl中處理異常的最佳方式是什麼?
- 3. 在Rails中處理不存在變量的最佳方式是什麼?
- 4. 從Net :: HTTP處理異常的最佳方式是什麼?
- 5. 什麼是處理JMS異常的最佳方式
- 6. 處理彼此使用模塊的最佳方式是什麼?
- 7. 使用PRISM處理導航的最佳方式是什麼?
- 8. 使用SDL/C++處理事件的最佳方式是什麼
- 9. 使用git repo處理.htaccess的最佳方式是什麼?
- 10. 在Rails 2.1.x中處理RoutingError的最佳方法是什麼?
- 11. 使用Ruby on Rails管理實時配置變量的最佳方式是什麼?
- 12. 在我的Rails項目中使用yajl-ruby的最佳方式是什麼?
- 13. 在Ruby on Rails中管理配置的最佳方式是什麼?
- 14. 在C#中重用異常處理邏輯的最佳方式是什麼?
- 15. WPF,什麼是存儲啓動時要使用的常量的最佳方式?
- 16. 處理變更管理的最佳方式是什麼?
- 17. 在smarty中處理遞歸的最佳方式是什麼?
- 18. 在查找表中處理I18N的最佳方式是什麼?
- 19. 在php中處理函數的最佳方式是什麼?
- 20. 在python中處理字典的最佳方式是什麼?
- 21. 在C#中處理共享dll的最佳方式是什麼?
- 22. 在Android中處理Feed的最佳方式是什麼?
- 23. 在clojure中處理圖像的最佳方式是什麼?
- 24. 在rails中處理嵌套靜態頁面的最佳方式是什麼?
- 25. 在Rails 3中處理虛榮URL助手的最佳方式是什麼?
- 26. 處理異常的最佳方法是什麼?
- 27. 處理ObjectDataSource異常的最佳方法是什麼?
- 28. 什麼是監視大量Ruby進程的最佳方式?
- 29. 在C#中處理異步HttpWebRequest異常的最佳方式是什麼?
- 30. 在處理OpenRasta處理程序中的異常時,轉換爲響應的最佳方式是什麼?
[關於枚舉在Ruby中這另一個問題似乎是非常非常相似( http://stackoverflow.com/questions/164714/how-can-i-use-c-style-enumerations-in-ruby) – 2008-11-05 20:46:37