2016-04-07 12 views
2

で列挙型を使用して:Railsの - 私はモデルに列挙型を使用しています.whereクエリ

enum status: [:pending, :approved]

私はこのようになり、モデル内の一意性の検証があります。

validates :item_id, uniqueness: { scope: :user_id, conditions: -> { where(status: :approved) }, message: "You already have this item." } 

これを動作しません。 :approved1に変更した場合にのみ機能します。私がItem.first.update_attributes(status: :approved)のような何かをすることができるときに私がここでステータス名を使うことができない理由について混乱しています。

where(status: Model.statuses[:approved])

だけではなく記号:

答えて

8

はそうのようなモデルから列挙型の値を使用します。こうすれば、statusesのenumヘルパーメソッドは、フィルタを動作させるenumの整数値を渡します。列挙型の値は実際には、シンボルの文字列表現ではなく、DBに整数として格納されます。

+0

シンボルを使うことができますか、使用できないのはいつですか?シンボルを使って属性を設定するとうまくいくようです。 – user4584963

+1

enumレールを使用すると、内部的にenumの名前を持つgetterおよびsetterメソッドが作成され、setterを呼び出してシンボルを渡すと、対応する整数値の文字列キーが返されます。それを設定すると、それがデータベース(整数)上で永続化されるため、クエリを実行するときに、activerecordは、db内の整数列を、もちろん動作しない文字列でフィルタリングしようとします。したがって、長い話を簡単に言えば、列挙型の複数ハッシュに返される値を照会し、好きな場合はシンボルを割り当てます。 –

+1

ドキュメントを見てみると、現在の不安定なバージョンのレールでは、クエリー内のシンボルが許可されているようです:http://edgeapi.rubyonrails.org/classes/ActiveRecord/Enum.html –

関連する問題