web-dev-qa-db-ja.com

Railsを使用するときにRuby)で定数を処理するための最良の方法は何ですか?

モデルのフィールドの1つに有効なオプションを表す定数があります。 Rubyでこれらの定数を処理する最良の方法は何ですか?

43
Miles

(environment.rbで)この目的で配列またはハッシュを使用できます。

OPTIONS = ['one', 'two', 'three']
OPTIONS = {:one => 1, :two => 2, :three => 3}

または代わりに、定数とそれらを関連付けるために使用されるキーを列挙できる列挙クラス:

class Enumeration
  def Enumeration.add_item(key,value)
    @hash ||= {}
    @hash[key]=value
  end

  def Enumeration.const_missing(key)
    @hash[key]
  end   

  def Enumeration.each
    @hash.each {|key,value| yield(key,value)}
  end

  def Enumeration.values
    @hash.values || []
  end

  def Enumeration.keys
    @hash.keys || []
  end

  def Enumeration.[](key)
    @hash[key]
  end
end

これから、次のものを導出できます。

class Values < Enumeration
  self.add_item(:RED, '#f00')
  self.add_item(:GREEN, '#0f0')
  self.add_item(:BLUE, '#00f')
end

次のように使用します:

Values::RED    => '#f00'
Values::GREEN  => '#0f0'
Values::BLUE   => '#00f'

Values.keys    => [:RED, :GREEN, :BLUE]
Values.values  => ['#f00', '#0f0', '#00f']
40
Codebeef

次のように、それらをモデルクラスに直接配置します。

class MyClass < ActiveRecord::Base
  ACTIVE_STATUS = "active"
  INACTIVE_STATUS = "inactive"
  PENDING_STATUS = "pending"
end

次に、別のクラスのモデルを使用するときに、定数を参照します

@model.status = MyClass::ACTIVE_STATUS
@model.save
11
Micah

モデルの動作を促進している場合、定数はモデルの一部である必要があります。

class Model < ActiveRecord::Base
  ONE = 1
  TWO = 2

  validates_inclusion_of :value, :in => [ONE, TWO]
end

これにより、組み込みのRails機能を使用できます:

>> m=Model.new
=> #<Model id: nil, value: nil, created_at: nil, updated_at: nil>
>> m.valid?
=> false
>> m.value = 1
=> 1
>> m.valid?
=> true

または、データベースが列挙をサポートしている場合は、 Enum Column プラグインなどを使用できます。

9
Dave

Rails 4.1が追加されました ActiveRecord列挙型のサポート

値がデータベース内の整数にマッピングされる列挙型属性を宣言しますが、名前で照会できます。

class Conversation < ActiveRecord::Base
  enum status: [ :active, :archived ]
end

conversation.archived!
conversation.active? # => false
conversation.status  # => "archived"

Conversation.archived # => Relation for all archived Conversations

詳細については そのドキュメント を参照してください。

8
Simone Carletti

次のようなハッシュ内のモデル内でも使用できます。


class MyModel

  SOME_ATTR_OPTIONS = {
    :first_option => 1,
    :second_option => 2, 
    :third_option => 3
  }
end

次のように使用します。



if x == MyModel::SOME_ATTR_OPTIONS[:first_option]
  do this
end

5
Dema

モジュールを使用して、定数をサブジェクトにグループ化することもできます-

class Runner < ApplicationRecord
    module RUN_TYPES
        SYNC = 0
        ASYNC = 1
    end
end

そして、持っている、

> Runner::RUN_TYPES::SYNC
 => 0
> Runner::RUN_TYPES::ASYNC
 => 1
0
Ady Rosen