web-dev-qa-db-ja.com

モデル固有の定数をRails 3.1?

私はフィールドtypeserというモデルに持っています。これはdbのintです。 intの値は、ストアのタイプを特定します。例:

  • 0 =お母さん
  • 1 =お父さん
  • 2 =祖母
  • 等々

私はこのような他のいくつかのフィールドを持っているので、関連付けテーブルを作成するのはやり過ぎです。

モデルおよびコントローラーロジックの条件ステートメントの場所でこれらの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]

長くはなりますが、他の開発者が私のコードを読んでいるときは、より直感的に感じました。このソリューションを提供してくれた以下の太郎に感謝します。

21
Hopstream

何かのようなもの:

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
40
taro

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つの規則であり、重要ではありません。

10
Ollie Bennett

単一テーブル継承を使用しない限り、モデルの列名として「type」を使用することは避けてください。

http://api.rubyonrails.org/classes/ActiveRecord/Base.html#class-ActiveRecord::Base-label-Single+table+inheritance

3
Artur Beljajev

イニシャライザフォルダまたはlibフォルダにファイルを書き込む1つの方法

言うapp_contants.rbそしてこのファイルにあなたは書くことができます

MOM=1

DAD=2
  1. あなたが初期化子を書く場合、あなたはすることができます

user.type == mom

2.libファイルを作成する場合はそれをモジュールにします

 module app_constants
    mom = 1
    dad = 2
  end 

必要な場所にこのモジュールを含めるだけです

1
Ross