これはおそらく簡単な質問ですが、Rubyの定数名を値から検索しようとしています。例えば:
class Xyz < ActiveRecord::Base
ACTIVE = 1
PENDING = 2
CANCELED = 3
SENT = 4
SUSPENDED = 5
end
1
私のデータベースにステータスがあります。ACTIVE
これに基づいて取得し、ビューに表示できるようにします。
それを行うための良い方法は何ですか?
これはおそらく簡単な質問ですが、Rubyの定数名を値から検索しようとしています。例えば:
class Xyz < ActiveRecord::Base
ACTIVE = 1
PENDING = 2
CANCELED = 3
SENT = 4
SUSPENDED = 5
end
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
ただし、これは行いません。プログラム名をビューの値として使用するのは悪い考えのようです。表示名を変更したい場合(「一時停止」は「保留中」と表示される場合があります)、コードをリファクタリングする必要がある状況に遭遇する可能性があります。
モデルの定数を使用して、ビューまたはコントローラーにマッピングを配置します。
status_name = {
Xyz::ACTIVE => "Active",
Xyz::PENDING => "Pending",
Xyz::CANCELED => "Canceled",
Xyz::SENT => "Away!",
Xyz::Suspended => "On Hold"
}
@status = status_name[@xyz.status_id]
私はそれを定数配列に入れます。
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番目の方法を追加しました。
定数が常に小さな整数から引き出されるとは限らない場合は、次のことも試すことができます。
class Xyz < ActiveRecord::Base
class << self
def int_to_status(x)
constants.find{ |c| const_get(c) == x }
end
end
end
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
@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
これについて言及するのは、定数を特定のクラスから完全に分離しておくと便利な場合があるためです。