在Rails 4.1中,如何通过枚举符号查找记录?

时间:2014-08-03 02:15:00

标签: ruby-on-rails ruby ruby-on-rails-4 rails-activerecord ruby-on-rails-4.1

假设我有这个模型:

class Conversation < ActiveRecord::Base
  enum status: [ :active, :archived ]
end

如何在不使用枚举的数值或不必迭代每个对话的情况下找到所有活动对话?

我尝试过Conversation.where(status: :active),但它没有产生任何结果。

我想到的唯一解决方案是迭代所有会话并选择活动会话,但它看起来不是一个好的解决方案。

Conversation.all.select {|conversation| conversation.active? }  

我能做些什么吗?

6 个答案:

答案 0 :(得分:56)

ActiveRecord::Enum根据其值提供范围。

试试吧:

Conversation.active

Conversation.archived

当然,您可以创建自己的范围,如Kyle Decot所述。

答案 1 :(得分:37)

这很有效:

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.快乐编码!

答案 2 :(得分:26)

ActiveRecord::Enum根据值提供内置范围,因此您只需执行以下操作:

Conversation.active
Conversation.archived

答案 3 :(得分:7)

Conversation.where(status: Conversation.statuses[:active])

答案 4 :(得分:3)

你试过Conversation.where(status: [:active, :archived])吗? 如列出here

答案 5 :(得分:-7)

试试这个:

.enum :status => {:active => "active", :archived => "archived"ok_off => "took off"}