Was ist der beste Weg, Konstanten in Ruby zu behandeln, wenn Rails?
-
06-07-2019 - |
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?
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. Siehe seine Dokumentation für eine detaillierte aufzuschreiben. class Conversation < ActiveRecord::Base
enum status: [ :active, :archived ]
end
conversation.archived!
conversation.active? # => false
conversation.status # => "archived"
Conversation.archived # => Relation for all archived Conversations
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