2016-04-07 7 views
2

ich Enum auf einem Modell bin mit:Schienen - mit Enum in einer .wo Abfrage

enum status: [:pending, :approved]

Ich habe eine Einzigartigkeit Validierung in dem Modell, das wie folgt aussieht:

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

Diese funktioniert nicht. Es funktioniert nur, wenn ich :approved zu 1 ändere. Ich bin verwirrt, warum ich den Statusnamen hier nicht verwenden kann, wenn ich etwas wie Item.first.update_attributes(status: :approved) tun kann, und es funktioniert gut.

Antwort

8

den ENUM-Wert aus dem Modell verwenden wie so:

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

Statt nur das Symbol. Auf diese Weise wird die enum-Hilfsmethode für statuses den Ganzzahlwert der Enumeration übergeben, der den Filter arbeiten lässt. Die Enum-Werte werden tatsächlich als Ganzzahlen im DB gespeichert und nicht als Zeichenfolgendarstellung der Symbole.

+0

Also nur um zu klären, wann kann und darf ich das Symbol nicht einfach benutzen? Das Attribut mit dem Symbol zu setzen scheint gut zu funktionieren. – user4584963

+1

Wenn Sie Enum-Rails intern verwenden, wird eine Getter- und Setter-Methode mit dem Namen der Enumeration erstellt, und der Getter gibt immer den Zeichenfolgenschlüssel für den entsprechenden Ganzzahlwert zurück. Wenn Sie den Setter aufrufen und das Symbol übergeben, wird nach dem Integer-Wert gesucht und setzen Sie es, und das ist was auf der Datenbank (die ganze Zahl) beibehalten wird, so wenn Sie ActiveRecord abfragen wird versuchen, eine Integer-Spalte in der DB mit einer Zeichenfolge zu filtern, die natürlich nicht funktioniert. Also, lange Rede kurzer Sinn, Abfrage mit dem Wert, der auf dem enum Pluralized Hash zurückgegeben wird, und mit einem Symbol zuweisen, wenn Sie möchten. –

+1

Ich habe mir nur die Dokumentation angesehen und es scheint, dass die aktuelle instabile Version von Rails nun ein Symbol in Abfragen erlaubt: http://edgeapi.rubyonrails.org/classes/ActiveRecord/Enum.html –