Rails Rails Enum 的疑问

tangmonk · 2015年09月22日 · 最后由 hw676018683 回复于 2015年09月24日 · 2863 次阅读

定义一个 model

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

官方文档里貌似只能用这种方式来 create

Conversation.create status: Conversation.statuses[:active]

但是我试了下也可以直接用 string 来创建

Conversation.create status: 'active'

用 string 创建有什么不妥吗?

使用 stringsymbolint 赋值都是可以的

Conversation.create status: :active
Conversation.create status: "active"
Conversation.create status: 0
Conversation.create status: Conversation.statuses[:active] 
# 这三种写法都是有效的,其中 Conversation.statuses[:active] 等效 0

https://github.com/rails/rails/blob/08576b94ad4f19dfc368619d7751e211d23dcad8/activerecord/lib/active_record/enum.rb#L82

楼上正解。文档里只是强调了:

Where conditions on an enum attribute must use the ordinal value of an enum.

示例如下:

Conversation.where("status <> ?", Conversation.statuses[:archived])

最新的 api 里 where 也可以使用 string 和 symbol

文档里面的这种写法更健壮一些,万一你要修改某个状态名字的话...

#3 楼 @hw676018683 不可以吧,我试了下 4.2.3

@huacnlee 上面的回复是 BUG?

#6 楼 @hw676018683 哦,,那是 4.2.4 才有的吧..方便了

#7 楼 @hw676018683 这不是 Bug,请加空格,解析器无法知道你后面几个文字是不是 URL 的部分。

#9 楼 @huacnlee 顺序也不对啊 5才会加上去在最后啊

需要 登录 后方可回复, 如果你还没有账号请 注册新账号