Rails 需要一个模块给所有 model 添加一个方法

orichi · 2012年11月08日 · 最后由 orichi 回复于 2012年11月10日 · 2742 次阅读

class User < ActiveRecord::Base end class Post < ActiveRecord::Base end

module A #TODO # add a method like virtual_id # this virtual_id find the last record in db and add 1

end

class ActiveRecord::Base include A end

user = User.new user.virtual_id = user.id should be User.last.id.suc post = Post.new post.virtual_id = post.id should be Post.last.id.suc 加入数据库最后一条的 id 是“post-orichi-142” 那么 virtual_id 应该是“post-orichi-143” 怎么在 module A 里定义方法 virtual_id, 使得 user 和 post 可以获取一个虚拟的 id

module A def virtual_id self.class.last.id.suc end end

Mark 一下

#1 楼 @orichi succ,少写了一个 c,😆

小强,你都已经给出方法了,你的问题是?

把 include 改成 extend

  1. 最好不要这样打开 ActiveRecord::Base, 可以在 ActiveRecord::Base 的 on_load 事件触发中加载,Railtie 都是这么做的。
  2. 要去掉所有的 scope 再取 last
  3. 这个 id 太容易过期了,多线程/进程的情况下很容易出问题。

@tumayun 问题是这个东西不好整啊,这样设计也不合理,多线程容易出问题,数据库 id 设置成 string 了,不知道咋搞

@pongyo 那最好怎么解决呢,主要问题是,id 被手动设置成 string 了,string 可以自增么?mysql 里

@jyz19880823 是少写了个 c,不好意思哈

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