我正在使用Rails 3.2.14我有一个对象模型调用Observation
,其属性为observation_status
当我调用Observation.observation_status
时,它将返回1, 2, or 3
}表示ready
waiting
finished
我在想我可以用一个返回字符串值的条件来制作一个方法(比如说observation_status_words
),但后来又研究了范围。
scope :status_ready, -> { where(observation_status: '2') }
scope :status_waiting, -> { where(observation_status: '1') }
scope :status_finish, -> { where(observation_status: '3') }
但后来我意识到这甚至无法解决我的问题。我的整体问题是,当状态不同时,我可以使用rails 3作用域返回字符串值。否则,我会采用类方法。我认为在Rails 4中有一个非常简洁的功能,但我在Rails 3.2上。我将此作为管理员面板使用,希望我的用户看到ready
waiting
finished
而不是整数。
更新
我采取这样做,但人们建议哈希映射?
def observation_status_words
case observation_status
when 1
return "Waiting for Reader 1"
when 3
return "Finished"
else
return "Ready"
end
end
答案 0 :(得分:1)
这不是什么范围。这与他们应该如何使用完全相反。您的范围应该是范围,您可以在其上链接其他范围。通过返回字符串,您将破坏此功能。
使用类方法。
答案 1 :(得分:1)
在rails 4中,您有枚举,在rails 3中,您可以使用gem symbolize https://github.com/nofxx/symbolize。不使用枚举,您需要将数据库中的整数值映射到它们所代表的相应字符串。
编辑:
像这样添加一个哈希常量
STATUS_WORD_MAPPING = {1 => :waiting, 2 => :ready, 3 => :finish}.freeze
def status_words #Ive removed observation as it is redundant with the class name
STATUS_WORD_MAPPING[observation_status] # I think observation_status is a method you have defined? either way just replace it with whatever gets you the key.
end
现在,对于像"Waiting for Ready 1"
等文本。应该在帮助器中定义,因为它们是具有表示逻辑的正确位置,或者可能使用I18n
语言环境。另外,作为参考,我会将列重命名为observation_status
(我认为它是一列),因为它的命名是多余的。我认为将其重命名为status
会有所帮助,因为看到一个名为@observation.observation_status
的方法看起来很奇怪,因为它可能只是@observation.status