Ruby:在某些命名空间的上下文中工作

时间:2014-07-07 07:39:11

标签: ruby namespaces

这是一段使用enum多次的代码:

.where("items.state in (#{Workflow::ItemStatus::MOVING},#{Workflow::ItemStatus::WAITING},#{Workflow::ItemStatus::EXECUTING},#{Workflow::ItemStatus::ASSIGNED})")

我不喜欢的是Workflow::ItemStatus命名空间重复多次产生一个长字符串。

我想将代码包装在一些允许我这样做的结构中:

.where("items.state in (#{[MOVING, WAITING, EXECUTING, ASSIGNED].join(',')})")

2 个答案:

答案 0 :(得分:1)

你可以写

constants = %i(MOVING WAITING EXECUTING ASSIGNED)
.where("items.state in (?)", constants.map { |c| Workflow::ItemStatus.const_get(c) })

答案 1 :(得分:0)

我为自己找到了妥协解决方案:

st = Workflow::ItemStatus
Item.joins(.....).where("items.state in (#{st::MOVING},#{st::WAITING},#{st::EXECUTING},#{st::ASSIGNED})")