免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2742 | 回复: 0
打印 上一主题 下一主题

自己写个gem叫change_log 水平有限欢迎斧正 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-01-26 16:44 |只看该作者 |倒序浏览
转:Auckland

自己写个gem叫change_log 水平有限欢迎斧正



这几天把公司项目上的一些东西整理了整理,把能单独拿出来的东西都拿出来。写成gem,这样公司其他的项目就可以方便使用了。

change_log,也叫maintenance log. 意思就是保存所有表中数据的修改。包括谁在什么时间创建/修改/删除了哪些东西。

应用环境:

例如,公司有个会计系统。如果哪天你看见有一个账目变的非常奇怪,好像跟你之前看到的不大一样。
可以调出所有的change_log。一看,原来是小谁家的小谁把某个数改了。找到了元凶。

可能应用面不是很广,但是放在这里还是请大家斧正斧正。

rubygems 里面有类似的gem. 在这里我不想讨论谁抄了谁的理念。

只想把自己的东西越弄越好,说不定能帮助其他人。

谢谢

下面是用法:

1 安装:
  Java代码
  1. # console window   
  2. gem install change_log   
  3.   
  4. # environment.rb   
  5. config.gem 'change_log'  
复制代码
或者 用 bundler
  Java代码
  1. # Gemfile   
  2. gem 'change_log'  
  3.   
  4. # console window   
  5. bundle install   
复制代码
2. Database Table
   创建一个migration file:
   注意: 名字可以随便起,只要在environment.rb里面重新声明就可以。
Java代码
  1. class AddChangeLog < ActiveRecord::Migration   
  2.   def self.up   
  3.     create_table :change_logs do |t|       # feel free to choose another table name   
  4.      t.integer :version, :null=>false      # store version of each change   
  5.      t.string :record_id,:limit=>30        # store the actual record id   
  6.      t.string :table_name, :limit=>60      # store the table name   
  7.      t.string :attribute_name,:limit=>60   # store the column name   
  8.      t.string :user, :limit=>20            # store the user who made the change   
  9.      t.string :action, :limit=>6           # store the change action: create, read, update, delete   
  10.      t.text :old_value                     # the value before change   
  11.      t.text :new_value                     # value after change   
  12.      t.string :field_type, :limit=>30      # the column type eg. date, text, varchar, int etc   
  13.      t.timestamps   
  14.     end   
  15.   end   
  16.   
  17.   def self.down   
  18.     drop_table :change_logs   
  19.   end   
  20. end  
复制代码
然后:
Java代码
  1. #console window   
  2. db:migrate  
复制代码
3. 应用
在你想要保存修改记录的model里加上这个:
Java代码
  1. enable_change_log :ignore=>[:updated_at,:user_password]
复制代码
用ignore来声明那些不想被保存的column.


  在application controller 里加一个current_user 方法:
Java代码
  1. def current_user   
  2.   return session[:user] # replace this with your own code   
  3. end  
复制代码
这样的话,在controller 和helper里面的所有CRUD都会被记录下来。


如果,你在model中进行修改的话。 例如:
Java代码
  1. # this is a model file   
  2. def making_some_changes   
  3.   user = User.find(:first)   
  4.   user.website = 'www.javaeye.com'  
  5.   user.save   
  6. end  
复制代码
你可以用whodidit这个属性。这个是change_log自动添加进去的。
Java代码
  1. # this is a model file   
  2. def making_some_changes   
  3.   user = User.find(:first)   
  4.   user.website = 'www.javaeye.com'  
  5.   user.whodidit = 'javaeye'  # 这样就可以了   
  6.   user.save   
  7. end  
复制代码
4. 列出已经保存的修改记录

用 ChangeLogs model,来调用修改记录。

Java代码
  1. # List all changes   
  2. ChangeLogs.find(:all)   
  3.   
  4. # List all changes for table 'accounts'  
  5. ChangeLogs.find(:all,:conditions=>['table_name = ?', 'accounts'])  
复制代码
5. 如果你想用别的表名。 那就修改migration文件。
   然后在environment.rb里面声明:
Java代码
  1. # config/environment.rb   
  2. ChangeLogs.set_table_name('maintenance_logs')  
复制代码
6. 一些连接:

Rubygems: https://rubygems.org/gems/change_log

GitHub:  https://github.com/peterzatncs/change_log

7. 参考资料

http://railscasts.com/episodes/245-new-gem-with-bundler

http://docs.rubygems.org/read/chapter/20


最后,欢迎任何批评和斧正。
我必须承认有很多地方还不足。光是一个Readme就修改了很多次。

再次感谢。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP