如何扩展自定义rails方法?

时间:2013-04-20 03:03:15

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

我有一个名为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,但无法弄清楚如何实现这一目标。

有什么想法吗?

2 个答案:

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