2016-04-07 56 views
2

我使用一個模型枚舉使用枚舉:導軌 - 在。凡查詢

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),它工作正常。

回答

8

從模型中使用枚舉值,像這樣:

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

而不僅僅是象徵。這樣,statuses的枚舉幫助器方法將傳遞將使過濾器工作的枚舉的整數值。枚舉值實際上作爲整數存儲在數據庫中,而不是作爲符號的字符串表示。

+0

所以,只是爲了澄清我什麼時候可以而且不能只使用符號?使用符號設置屬性似乎工作得很好。 – user4584963

+1

當您使用enum rails內部使用枚舉的名稱創建getter和setter方法並且getter將始終返回相應整數值的字符串鍵時,當您調用setter並傳遞符號時,rails將查找整數值並設置它,這是什麼被持久化在數據庫(整數),所以當你查詢activerecord時,會嘗試過濾一個字符串的數據庫中的整數列,當然不會工作。因此,長話短說,用enum複數散列返回的值進行查詢,如果您願意,可以使用符號進行賦值。 –

+1

剛剛查看了文檔,似乎當前不穩定版本的rails允許在查詢中使用符號:http://edgeapi.rubyonrails.org/classes/ActiveRecord/Enum.html –