7

这可能是一个简单的问题,但我试图从值中查找 Ruby 中的常量名称。例如:

class Xyz < ActiveRecord::Base
  ACTIVE    = 1
  PENDING   = 2
  CANCELED  = 3
  SENT      = 4
  SUSPENDED = 5
end

我的数据库中有一个状态1。我想ACTIVE基于此进行检索,以便可以在视图中显示它。

这样做的好方法是什么?

4

5 回答 5

7
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

但是,我不会这样做:使用编程名称作为视图的值似乎是个坏主意。您可能会遇到想要更改显示名称的情况(可能“暂停”应显示为“暂停”),然后您必须重构代码。

我会使用模型中的常量在您的视图或控制器中放置一个映射:

status_name = {
  Xyz::ACTIVE    => "Active",
  Xyz::PENDING   => "Pending", 
  Xyz::CANCELED  => "Canceled", 
  Xyz::SENT      => "Away!", 
  Xyz::Suspended => "On Hold"
}
@status = status_name[@xyz.status_id]
于 2012-05-22T01:19:34.727 回答
5

我会把它放到一个常量数组中。

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

#get_status 中的负 1 和 #get_status_id 中的 + 1 用于零索引数组。我添加了第二种方法,因为我发现自己不时需要它。

于 2012-05-22T00:14:55.670 回答
3

如果您的常量并不总是从小整数中提取,您也可以尝试:

class Xyz < ActiveRecord::Base
  class << self
    def int_to_status(x)
      constants.find{ |c| const_get(c) == x }
    end
  end
end
于 2012-05-22T00:23:23.753 回答
2
class Xyz < ActiveRecord::Base

  STATUSES = { 
    1 => ACTIVE,
    2 => PENDING,
    3 => CANCELED,
    4 => SENT,
    5 => SUSPENDED
  }

  def status_name
    STATUSES[ status ]   
  end

  def status_by_name( name )
    STATUSES.key( name ) 
  end

end
于 2012-05-22T14:23:53.553 回答
0

扩展@Phrogz 我认为这也是一个选择:

module Xyz
  ACTIVE    = 1
  PENDING   = 2
  CANCELED  = 3
  SENT      = 4
  SUSPENDED = 5      

  def self.constant_by_value( val )
    constants.find{ |name| const_get(name)==val }
  end
end

Xyz.constant_by_value(2)
#=> :PENDING

我提到这一点是因为有时我发现将常量与特定类完全隔离很方便。

于 2016-07-21T04:44:34.150 回答