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 は、インデックスがゼロの配列用です。時々必要になるので、2番目の方法を追加しました。

于 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 に答える