Rails Enums for Active Record

huacnlee · 2013年11月05日 · 最后由 tq0fqeu 回复于 2014年04月26日 · 5810 次阅读

以后不用自己写那些重复的东西啦!我认为这个东西早就该有了!

class Conversation < ActiveRecord::Base
  enum status: %i( active archived )
end

Conversation::STATUS # => { active: 0, archived: 1 }

# conversation.update! status: 0
conversation.active!
conversation.active? # => true
conversation.status  # => :active

# conversation.update! status: 1
conversation.archived!
conversation.archived? # => true
conversation.status    # => :archived

# conversation.update! status: 1
conversation.status = :archived

https://github.com/rails/rails/commit/db41eb8a6ea88b854bf5cd11070ea4245e1639c5

太好了,终于有了,我现在就去改改试试 - -

我可以理解成添加了个枚举类型么

%i是 2.0 才有的,怪不得现在机器上 console 里面打不出来。。 这个 enum 支持现在 rails 所有版本都有吗?github 上看不出来他改的哪个版本。

终于内建了,为了这个换了好多个 gem,目前用着最好的是 https://github.com/brainspec/enumerize

我坚持用符号。

@chechaoyang 也是用 enumerize,不过更常的时候是更需要 finite state machine 而转换成 workflow。

Rails 的实作好像还是不是使用 mysql 这类内建的 enum。

我觉得这个也挺好用的 https://github.com/geekq/workflow

虽然定义的时候比较繁琐,但是因为状态的改变往往伴随着函数的调用,而且一个状态在进行转变的时候经常有成功和失败两种可能,这个比较适合略微复杂的工作流和状态机

#6 楼 @lulalala 嗯,看使用场景,我只在纯枚举的时候用 enumerize。状态机和工作流我都在用 https://github.com/aasm/aasm

赶紧实现这个 https://github.com/rails/rails/commit/db41eb8a6ea88b854bf5cd11070ea4245e1639c5#commitcomment-4496447 才对 一直很奇怪 activerecord 为啥不给这方面的支持

....这东西……修改的话会怎么样?

最近看 rails 的提交,好像天天都在很热闹的改这个东西。。。。

我 确实可以减少很多代码了

实用!

一直用常量,有人跟我一样么?

重点还是提供的这几个方法,会带来很多便利,不用每个地方都写一次,我之前还有些那种专门为 Dropdown 生成 option 而设计的方法

挺好的,以前字符串字段,各种 statemachine aasm 甚至还有 drules 的五花八门早该统一下了...

非常喜欢这个 feature,目前我们还在用 rails 3。

打算使用这个 feature,所以搞了个 Rails3 支持

https://github.com/poshboytl/rails3_ac_enum

可以直接安装

gem install rails3_ac_enum

#18 楼 @poshboytl 这 gem 的名字注定活不长啊

#19 楼 @huacnlee 哈哈,就是解个馋。升级了 4 的就没必要了。

#20 楼 @poshboytl 唉,你换马甲以后,我都不认识了...头像没有识别度啊!

这个实现太粗糙了点,当你要做 i18n 或者要显示“男”/“女”这样的值时,还是用 gem enumerize 会方便很多

没有 aasm 强大!

我也有写类似的插件 https://github.com/liangwenke/acts_as_enum 添加了更多常用的东西,但是没做 update 的操作,因为很多时候更新的不只一个字段,放在插件里感觉不太实用。

enumerize 好用

注意 现在 Conversation::STATUS 的用法已改为 Conversation.statuses

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