新手问题 请问有没有现成页面过期方案

louis_sherren · 2016年08月02日 · 最后由 catherine 回复于 2016年08月02日 · 1915 次阅读

工作中遇到一个场景:

有一个比较复杂的对某一流程设置页面,用户在这个页面的停留时间会比较长。如果当两个人同时停留在这个页面对某个流程做设置(流程的设置都通过 ajax 来完成的),很容易出现前后端数据不一致而产生 bug。

现在我的方法是:给流程 model 增加了一个字段 version,当某个人对这个流程有过操作后,after_save 里会对这个 version 加 1。并且在前端发送的 ajax 请求中都增加一个 version 字段,如果发送过来的 version 小于 db 中存放的 version,则 render 一个 dialog 提醒用户刷新 page。这个已经做好了,不过我觉得这种方式有一些 ugly。因为这里其实涉及到流程 model 的关联 model 更新的话,也需要去更新流程的 version,所以只要出现一种这样关联的 model,我的判断中就要多写一个 if else 了。

这个问题我认为可以抽象出来其实就是解决页面过期的问题,之前我 google 了一通没有找到现成的方法去解决,请假各位聚聚遇到这种情况是怎么做的?

version 很好啊,很合适的场景。不明白关联的 models 有什么关系,version 不对的时候流程 model 自身都被禁止更新了,更不用说关联的 models 了,不用一个个地过。有什么问题?

#1 楼 @billy 判断是否过期的时候确实比较方便了。关键就是什么时候需要给 version+1

因为不仅是改变流程本身需要给 version+1,流程 model 的一部分关联 model 在更新的时候,也需要给流程 model 的 version+1,所以这个地方我就要为这些 model 都加一个 after_update 和 after_destroy 的 callback,callback 里去更新流程的 version。

我想看看有没有现成的更加通用的 gem 去做这件事,因为我觉得这个应该是业务逻辑无关的需求。

明白了,是反向的。据我所知是没有这样的 gem, 自己手写岂不是比 gem 好。

嗯,就想看看有没有,免得重复造轮子了

ActiveRecord 有 Optimistic Locking,设置 lock_version 即可

#5 楼 @quakewang cool,但我的需求是,一些关联的 model 更新后也更新 workflow 的 version,比如 B has_many C,当属于 B 的任意一个 C 发生变化后,B 的 version 需要改变

直接用 updated_at 判断不可以吗?关联属性更新的话 touch 一下。

updated_at 就行了…

有乐观锁,记得好像是加一个字段就可以了

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