2013-04-20 53 views
0

我有一个名为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,但不知道如何做到这一点。

有什么想法?

+1

看起来它可以作为[状态机](https://github.com/troessner/transitions)实现。 – Stefan 2013-04-20 06:33:34

+0

如果这些状态是相互排斥的,为什么不能有一个'status'字段并让您的视图使用一组单选按钮或一个选择字段来设置状态? – 2013-04-20 03:08:25

回答

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 
0

起初我非常双重这些方法是有效的。

这些方法用于在工作流程中定义特定状态。常识上它们是相互排斥的。也就是说,“处于未决状态”的项目不能成为“活跃”或“正在审核”的项目,或者该组中的任何其他状态。

基于上述情况,为什么不将所有这些状态都设置为此模型中的Enum属性“status”?此属性值可以是“挂起,活动,启动...”中的任何一个。“通过此,您可以使用一个字段替换5个字段

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

<strong>Status: </strong><%= @project.status.titleize %>