2
で列挙型を使用して:Railsの - 私はモデルに列挙型を使用しています.whereクエリ
enum status: [:pending, :approved]
私はこのようになり、モデル内の一意性の検証があります。
validates :item_id, uniqueness: { scope: :user_id, conditions: -> { where(status: :approved) }, message: "You already have this item." }
これを動作しません。 :approved
を1
に変更した場合にのみ機能します。私がItem.first.update_attributes(status: :approved)
のような何かをすることができるときに私がここでステータス名を使うことができない理由について混乱しています。
where(status: Model.statuses[:approved])
だけではなく記号:
シンボルを使うことができますか、使用できないのはいつですか?シンボルを使って属性を設定するとうまくいくようです。 – user4584963
enumレールを使用すると、内部的にenumの名前を持つgetterおよびsetterメソッドが作成され、setterを呼び出してシンボルを渡すと、対応する整数値の文字列キーが返されます。それを設定すると、それがデータベース(整数)上で永続化されるため、クエリを実行するときに、activerecordは、db内の整数列を、もちろん動作しない文字列でフィルタリングしようとします。したがって、長い話を簡単に言えば、列挙型の複数ハッシュに返される値を照会し、好きな場合はシンボルを割り当てます。 –
ドキュメントを見てみると、現在の不安定なバージョンのレールでは、クエリー内のシンボルが許可されているようです:http://edgeapi.rubyonrails.org/classes/ActiveRecord/Enum.html –