新手问题 审核功能如何实现?简单一个 state 字段?还是有更复杂的东西?

chairy11 · 2015年05月05日 · 最后由 danlideng 回复于 2017年06月01日 · 2984 次阅读

很多用户情景都会用到「审核」这个功能。 比如文章或评论需要先审核再发表。 比如请假需要在 OA 提交审核后批准。 可我一时又找不到合适的参考代码,不知道别人的实现思路是怎样的?

以我简单的思维,目前能想到的就是,在被审核的 model 加一个 state 字段。 比如,如果「articles」要通过「审核」才能发表,那就在 article 这个 model 加一个 integer 字段叫 state,这个是用户不可编辑的字段,

  • 在文章 create 成功时,state 默认为 0(未审核)
  • 管理员有审核权限, 要是通过,就把 state 更新为 1(通过审核),要是不通过,就把 state 更新为 2(审核未通过).

一般都怎么做的呢? 有哪些项目有这些相关的内容可以参考一下吗?

另外,我看到两个 GEM,workflowAASM - Ruby state machines 但我在想,有没有必要用 GEM 呢?是不是把简单的问题复杂化了呢?还是我没考虑周全呢? 自己实现,不用 Gem 的话,会不会有什么坑呢?

我们网站的订单有几个状态 in_checkoutpendingcompletedcanceledclose 我们用了https://github.com/pluginaweek/state_machine 这个state_machineGem 来管理 主要是有这个几点需求:这个状态能否转变到另一个状态需要限制,在状态转换的时候需要一些回调来处理一些事务 你可以参考下 具体看你需求

#1 楼 @zhang_soledad 哦,谢谢。感觉这个 GEM 好像很久没有更新的样子……平时用 GEM 的时候你们会考虑这些因素吗?

如果状态只有审核和非审核,通常我会用时间: published_at, 默认创建出来是 published_at 是 nil,审核过了,设置为 Time.now

如果有 2 种以上的状态,可以考虑用 state machine

@chairy11 这个 Gem 已经不维护了 在 4.1 及以下版本都是可以正常使用的 4.2 的话https://github.com/state-machines/state_machines-activerecord这个在维护 用 Gem 有时候是省事 不想自己写 人手又不够 也就用了 也有麻烦的地方 都是开源的 有可能那个作者撒手就不干了 后面维护又很麻烦 Rails 升级的时候特麻烦

不过也要看具体项目 像我做的权限管理用了sixhttps://github.com/randx/six 这个 Gem,GitLab 也用的这个 Gem,也很久没有更新了,因为实在是没有需要更新的地方,除非 ruby 像 python 那样出现了不向前兼容的升级,代码也简单,不用 Gem 都可以,你都可以直接抄代码。

所有,具体看情况了,是否用 Gem,用什么 Gem,这个也是 Rails 开发需要注意的地方吧

#4 楼 @zhang_soledad 哦,受教了,谢谢:)

#3 楼 @quakewang 恩,很好的思路,谢谢:)

我们现在在用的是 workflow https://github.com/geekq/workflow 这个 gem

#7 楼 @ywjno workflow 好像还是有特定的使用场景。 如果我要在几十万数据中找到状态为 "awaiting_review" 的记录,岂不是很麻烦?

#8 楼 @peter workflow 进行中的 object 都放到单独的一张表里面,等该 workflow 状态完成的时候(比如 accept)把该数据从表中逻辑删除,所以不会很麻烦

10楼 已删除
11楼 已删除

#11 楼 @peter 回的时候还没 10 楼,我只是回答【如果我要在几十万数据中找到状态为 "awaiting_review" 的记录,岂不是很麻烦?】这个问题而已

#12 楼 @ywjno 是的,没 10 楼,我只是遇到头大的问题,想请教一下你,有没有更好的解决方案。既要有审核,还要带历史。

#9 楼 @ywjno 其实我没看懂 workflow 这个 gem。aasm 是在要添加审核的 model 加 aasm_state 字段,那 workflow 呢? 你说的单表,有什么字段?多态的?怎么源码没找到什么类似 migration 的东西的?

#13 楼 @peter 现在我们的系统只需要保留最近的一次审批意见,所以没法帮你解决这个问题了。而且这个问题也是我们下一个项目遇到的麻烦处之一,或许要跟其他项目进行借鉴了(比如 java 的 activiti

#14 楼 @chairy11 它其实只是用来保存一条记录的状态以及下一个状态的情况,workflow 默认对应的是 workflow_state 这个字段,单表也就是个跟该记录进行关联的表,多对一的关系

#7 楼 @ywjno #13 楼 @peter #4 楼 @zhang_soledad 话说,这些状态机的 gem,都不记录审核者的么?是应该我自己来实现对吧?它的功能只是控制从一个状态转到另一个状态的流向是吧?

#17 楼 @chairy11 状态机就应该只关注状态么,记录审核者这个需求不难实现哇

@chairy11 记录审核者应该是另一个功能了 kiss(keep it simple stupid)

我也正在被这个问题所困扰。请问你最终是如何解决的?danlideng@yahoo.com

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