这更像是一个风格问题,我想知道其他人是怎么做的。
假设我的数据库中有一个名为“status”的字段用于博客文章。我希望它有几个可能的值,例如“草稿”、“等待审核”和“已发布”。
显然我们不想每次都在这些魔法值中“硬编码”,那样不会很干。
所以我有时做的是这样的:
class Post
STATUS = {
:draft => "draft",
:awaiting_review => "awaiting review",
:posted => "posted"
}
...
end
然后我以后可以编写引用它的代码,如 STATUS[:draft]
或 Post::STATUS[:draft]
等
这工作正常,但有一些我不喜欢的地方。
- 如果您输入错误并调用类似
STATUS[:something_that_does_not_exist]
的代码,它不会抛出错误,它只会返回 nil,并且可能会在您之前在数据库中设置它,等等曾经注意到一个错误 - 写类似
if some_var == Post::STATUS[:draft]
...
我不知道,有些东西告诉我有更好的方法,但只是想看看其他人是怎么做的。谢谢!
最佳答案
您可以使用 Hash.new 并为其提供一个 block 参数,如果 key 未知则调用该参数。
class Post
STATUS = Hash.new{ |hash, key| raise( "Key #{ key } is unknown" )}.update(
:draft => "draft",
:awaiting_review => "awaiting review",
:posted => "posted" )
end
它有点乱,但它有效。
irb(main):007:0> Post::STATUS[ :draft ]
=> "draft"
irb(main):008:0> Post::STATUS[ :bogus ]
RuntimeError: Key bogus is unknown
from (irb):2
from (irb):8:in `call'
from (irb):8:in `default'
from (irb):8:in `[]'
from (irb):8
关于ruby-on-rails - Ruby 风格问题 : storing hash constant with different possible values,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2106955/