jig*_*esh 7 ruby ruby-on-rails
这可能是一个简单的问题,但我试图从值中查找Ruby中的常量名称.例如:
class Xyz < ActiveRecord::Base
ACTIVE = 1
PENDING = 2
CANCELED = 3
SENT = 4
SUSPENDED = 5
end
Run Code Online (Sandbox Code Playgroud)
我的数据库中有状态1.我想ACTIVE基于此检索,以便我可以在视图中显示它.
有什么好办法呢?
class Module
def constant_by_value( val )
constants.find{ |name| const_get(name)==val }
end
end
class Xyz
ACTIVE = 1
PENDING = 2
CANCELED = 3
SENT = 4
SUSPENDED = 5
end
p Xyz.constant_by_value(4)
#=> :SENT
Run Code Online (Sandbox Code Playgroud)
但是,我不会这样做:使用程序化名称作为视图的值似乎是一个坏主意.您可能会遇到想要更改显示名称的情况(可能"暂停"应显示为"暂停"),然后您必须重构代码.
我使用模型中的常量在视图或控制器中放置一个映射:
status_name = {
Xyz::ACTIVE => "Active",
Xyz::PENDING => "Pending",
Xyz::CANCELED => "Canceled",
Xyz::SENT => "Away!",
Xyz::Suspended => "On Hold"
}
@status = status_name[@xyz.status_id]
Run Code Online (Sandbox Code Playgroud)
我会把它放到一个常数数组中.
class xzy < ActiveRecord::Base
STATUSES = %w{ACTIVE PENDING CANCELLED SENT SUSPENDED}
def get_status
STATUSES[self.status-1]
end
def get_status_id(name)
STATUSES.index(name) + 1
end
end
Run Code Online (Sandbox Code Playgroud)
#get_status中的减1和#get_status_id中的+ 1适用于零索引数组.我添加了第二种方法,因为我不时发现自己需要这种方法.
| 归档时间: |
|
| 查看次数: |
3186 次 |
| 最近记录: |