web-dev-qa-db-ja.com

Rails 4.1、enumシンボルでレコードを見つける方法は?

私はこのモデルを持っていると仮定します:

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

列挙型の数値を使用せずに、または各会話を反復することなく、すべてのアクティブな会話を見つけるにはどうすればよいですか?

Conversation.where(status: :active)を実行しようとしましたが、結果が得られませんでした。

頭に浮かぶ唯一の解決策は、すべての会話を反復してアクティブな会話を選択することですが、それは良い解決策には見えません。

_Conversation.all.select {|conversation| conversation.active? }  
_

これについて何かできることはありますか?

40
Abdulaziz

ActiveRecord::Enumは、その値に基づいてスコープを提供します。

ちょうど試して:

Conversation.active

または

Conversation.archived

もちろん、 Kyle Decot 前述のように、独自のスコープを作成できます。

56
Kensuke Naito

これはうまく機能します:

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.幸せなコーディング!

38
Mirror318

ActiveRecord :: Enum は、値に基づいて組み込みスコープを提供するため、次のことが簡単にできます。

Conversation.active
Conversation.archived
26
Kyle Decot
Conversation.where(status: Conversation.statuses[:active])
7
6ft Dan

Conversation.where(status: [:active, :archived])を試しましたか?リストされているとおり here

3
Shifa Khan