Railsは初めてなので、ここで何が最善のアプローチなのかわかりません。データベースでカスタム型として使用できる単純な C++ スタイルの列挙型を定義したいと考えています。列挙型は配列またはカスタム モジュールでシミュレートできますが、それをテーブルのカスタム型に変換するにはどうすればよいですか?
3 に答える
私がレールで従うパターンは次のとおりです。
私のモデル クラスでmodule
は、列の可能な値を保持するために を追加します。次に、それらを配列に入れ、可能な値の配列に対する検証を定義します。
status
と呼ばれる列/属性があり、それが 3 つの可能な値であると想像してください。私はこれをします:
class MyModel < ActiveRecord::Base
# This validates that status can't be null
validates :status, :presence => true
# Define a module with all possible values
module Status
IN_DEVELOPMENT = 'in development'
DISABLED = 'disabled'
ACTIVE = 'active'
end
# Now create an array of possible status values, and add a validation
STATUSES = [ Status::DISABLED, Status::ACTIVE, Status::IN_DEVELOPMENT]
validates :status, :inclusion => { :in => STATUSES, :message => "%{value} is not a valid status value" }
end
データベースに組み込まれている列挙サポートを使用することを検討しましたか?Postgres( http://www.postgresql.org/docs/9.1/static/datatype-enum.htmlを参照)やMySQL(http://dev.mysql.com/docを参照)など、多くの一般的なRDMBSが列挙型をサポートしています。 /refman/5.5/en/enum.html)。これにより、データストアに型を直接作成し、ActiveRecordプラグインの1つ(Postgresのenum_type:https ://github.com/riscfuture/enum_typeなど)を介して使用できます。
または、active_enumのようなものを使用して、説明したように列挙を構造化し、フィールドを整数としてデータベースに格納することもできます。
コードでこの列挙型をどのように利用するかによって、特定の値のみが確実に設定されるように、スコープをデータベースの列挙型とほぼ同じように使用できることがわかりました。
例:
scope :trial, :conditions => { :utype => 'TRIAL' }
scope :registered, :conditions => { :utype => 'REGISTERED' }
scope :active, :conditions => { :status => 'ACTIVE' }
scope :abuse, :conditions => { :status => 'ABUSE' }