以后不用自己写那些重复的东西啦!我认为这个东西早就该有了!
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 上看不出来他改的哪个版本。
@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 为啥不给这方面的支持
非常喜欢这个 feature,目前我们还在用 rails 3。
打算使用这个 feature,所以搞了个 Rails3 支持
https://github.com/poshboytl/rails3_ac_enum
可以直接安装
gem install rails3_ac_enum
我也有写类似的插件 https://github.com/liangwenke/acts_as_enum 添加了更多常用的东西,但是没做 update 的操作,因为很多时候更新的不只一个字段,放在插件里感觉不太实用。