0

我有一个名为 Projects 的 Rails 模型:

class Project < ActiveRecord::Base

具有多种拨动开关,如活动、已启动、付费等。

然后我有一种方法可以以人类可读的格式返回状态:

def status
  return 'Pending' if self.pending?
  return 'Started' if self.started
  return 'In Review' if self.in_review?
  return 'Approved' if self.approved
  return 'Active' if self.active
end

现在我有另一种称为status!返回相同信息但以符号形式返回的方法,这在我看来效率低下:

def status
  return :pending if self.pending?
  return :started if self.started
  return :awarded if self.awarded
  return :in_review if self.in_review?
  return :approved if self.approved
  return :active if self.active
end

我显然想做的是更像status.to_sym但不知道如何做到这一点。

有什么想法吗?

4

2 回答 2

1

这个怎么样:

def status
  return 'Pending' if self.pending?
  return 'Started' if self.started
  return 'In Review' if self.in_review?
  return 'Approved' if self.approved
  return 'Active' if self.active
end

def status!
  # added gsub otherwise 'In Review' is returned as ':in review'
  status.gsub(/\s+/, "_").downcase.to_sym
  # status.parameterize.underscore.to_sym <- another option, Rails only
end
于 2013-04-20T03:16:44.620 回答
0

起初我高度加倍这些方法是有效的。

这些方法用于定义工作流中的某种状态。在常识中,它们是相互排斥的。也就是说,“待定”项目不能是“活动”、“审查中”或该组中的任何其他状态的项目。

基于上述,你为什么不在这个模型中将所有这些状态设置为枚举属性“状态”?该属性值可以是“pending, active, started...”中的任何一个,这样您就可以使用一个字段替换 5 个字段

然后,即使没有控制器方法,也很容易直接在视图中以人类可读的格式获取状态。

<strong>Status: </strong><%= @project.status.titleize %>
于 2013-04-20T06:49:10.980 回答