Rails 3使用返回字符串值的范围

时间:2014-05-30 19:10:43

标签: ruby-on-rails ruby ruby-on-rails-3

我正在使用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

2 个答案:

答案 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