В Rails 4.1, как найти записи по символу enum?
Предположим, у меня есть эта модель:
class Conversation < ActiveRecord::Base
enum status: [ :active, :archived ]
end
Как я могу найти все активные разговоры без использования числового значения перечисления или без необходимости перебирать каждый разговор?
Я пытался делать Conversation.where(status: :active)
, но это не дало никаких результатов.
Единственное решение, которое приходит на ум, - это перебирать все разговоры и выбирать активные, но это не выглядит хорошим решением.
Conversation.all.select {|conversation| conversation.active? }
Что я могу с этим поделать?
6 ответов
ActiveRecord::Enum
предоставляет области действия на основе его значений.
Просто попробуй:
Conversation.active
или же
Conversation.archived
Конечно, вы можете создавать свои собственные области, как упоминал Kyle Decot.
Это прекрасно работает:
Conversation.where("conversation.status = ?", Conversation.statuses[:active])
По какой-то причине это НЕ работает:
Conversation.where(status: :active) #searches for NULL
Conversation.where(status: 'active') #searches for status=0 no matter what the enum
Обновить
Все вышеперечисленные операторы работают с Rails 5. Удачного кодирования!
ActiveRecord::Enum предоставляет встроенные области видимости, основанные на значениях, так что вы можете просто сделать:
Conversation.active
Conversation.archived
Ты пробовал Conversation.where(status: [:active, :archived])
? Как указано здесь.
Попробуй это:
.enum :status => {:active => "active", :archived => "archived"ok_off => "took off"}