В 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: Conversation.statuses[:active])

Ты пробовал Conversation.where(status: [:active, :archived])? Как указано здесь.

Попробуй это:

.enum :status => {:active => "active", :archived => "archived"ok_off => "took off"}
Другие вопросы по тегам