我有一个名为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
,但无法弄清楚如何实现这一目标。
有什么想法吗?
答案 0 :(得分: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
答案 1 :(得分:0)
起初我高度加倍这些方法是有效的。
这些方法用于在工作流程中定义特定状态。在一般意义上,它们是相互排斥的。也就是说,“处于待处理状态”的项目不能是“活动”项目,“审核中”或该组中的任何其他状态。
基于上述,为什么不在此模型中将所有这些状态设置为Enum属性“status”?此属性值可以是“待处理,有效,已启动...”中的任何一个由此您使用一个字段来替换5个字段。
即使没有控制器方法,也可以直接在视图中以人类可读的格式获取状态。
<strong>Status: </strong><%= @project.status.titleize %>