Frage

Ich habe einige Konstanten, die die gültigen Optionen in einem mein Modell Felder repräsentieren. Was ist der beste Weg, um diese Konstanten in Ruby zu behandeln?

War es hilfreich?

Lösung

Sie können einen Array oder Hash für diesen Zweck verwenden (in Ihrem environment.rb):

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

oder alternativ eine Aufzählungsklasse, die Sie als auch Ihre Konstanten aufzuzählen über können als die Schlüssel verwendet, um sie zu verknüpfen:

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

, die Sie dann ergeben sich aus:

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

und verwenden Sie wie folgt aus:

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

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

Andere Tipps

Ich habe sie direkt in der Modellklasse, etwa so:

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

Dann, wenn das Modell von einer anderen Klasse verwenden, ich verweisen auf die Konstanten

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

Wenn es Modellverhalten fährt, dann sollte die Konstanten Teil des Modells sein:

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

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

Damit können Sie die eingebaute in Rails Funktionalität verwenden:

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

Alternativ, wenn Sie Ihre Datenbank Aufzählungen unterstützt, dann können Sie so etwas wie die

Rails 4.1 hinzugefügt Unterstützung für Active Aufzählungen .

eine ENUM-Attribut deklarieren, wo die Werte auf ganze Zahlen in der Datenbank abzubilden, sondern können nach Namen abgefragt werden.

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

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

Conversation.archived # => Relation for all archived Conversations

Siehe seine Dokumentation für eine detaillierte aufzuschreiben.

Sie können auch in einem Hash in Ihrem Modell verwenden wie folgt aus:


class MyModel

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

Und es wie folgt verwendet werden:



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

Sie können auch Gruppenkonstanten in Themen, ein Modul mit -

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

Und dann hat,

> Runner::RUN_TYPES::SYNC
 => 0
> Runner::RUN_TYPES::ASYNC
 => 1
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top