私はフィールドtypeをserというモデルに持っています。これはdbのintです。 intの値は、ストアのタイプを特定します。例:
私はこのような他のいくつかのフィールドを持っているので、関連付けテーブルを作成するのはやり過ぎです。
モデルおよびコントローラーロジックの条件ステートメントの場所でこれらのint値をチェックする代わりに、これらの定数を格納する場所がRailsにあります。
モデルとコントローラーからこれを実行できるようにするには?
if myuser.type == MOM
elsif myuser.type == GRAND_MOTHER
編集:最後に使用したソリューション:
モデル内:
# constants
TYPES = {
:mom => 0,
:dad => 1,
:grandmother => 2,
:grandfather => 3
}
論理的に:
if u.type == User::TYPES[:mom]
長くはなりますが、他の開発者が私のコードを読んでいるときは、より直感的に感じました。このソリューションを提供してくれた以下の太郎に感謝します。
何かのようなもの:
class User < ActiveRecord::Base
TYPES = %w{ mom dad grandmother grandfather son }
TYPES.each_with_index do |meth, index|
define_method("#{meth}?") { type == index }
end
end
u = User.new
u.type = 4
u.mom? # => false
u.son? # => true
Rails 4.1なので、 ActiveRecord :: Enum がサポートされています。
便利なチュートリアルがあります ここ 、しかし要するに:
# models/user.rb
class User < ActiveRecord::Base
enum family_role: [ :mum, :dad, :grandmother]
end
# logic elsewhere
u = User.first
u.family_role = 'mum'
u.mum? # => true
u.family_role # => 'mum'
注:現在のスキーム(データベースに値に対応する数値が既に格納されている)から変換するには、ハッシュ構文を使用する必要があります。
enum family_role: { mum: 0, dad: 1, grandmother: 2 }
さらに、デフォルトの状態用に0
を予約することをお勧めしますが、これは1つの規則であり、重要ではありません。
単一テーブル継承を使用しない限り、モデルの列名として「type」を使用することは避けてください。
イニシャライザフォルダまたはlibフォルダにファイルを書き込む1つの方法
言うapp_contants.rbそしてこのファイルにあなたは書くことができます
MOM=1
DAD=2
user.type == mom
2.libファイルを作成する場合はそれをモジュールにします
module app_constants
mom = 1
dad = 2
end
必要な場所にこのモジュールを含めるだけです