浏览 6659 次
精华帖 (0) :: 良好帖 (1) :: 新手帖 (0) :: 隐藏帖 (1)
|
|
---|---|
作者 | 正文 |
发表时间:2011-01-25
最后修改:2011-01-25
change_log,也叫maintenance log. 意思就是保存所有表中数据的修改。包括谁在什么时间创建/修改/删除了哪些东西。 应用环境: 例如,公司有个会计系统。如果哪天你看见有一个账目变的非常奇怪,好像跟你之前看到的不大一样。 可以调出所有的change_log。一看,原来是小谁家的小谁把某个数改了。找到了元凶。 可能应用面不是很广,但是放在这里还是请大家斧正斧正。 rubygems 里面有类似的gem. 在这里我不想讨论谁抄了谁的理念。 只想把自己的东西越弄越好,说不定能帮助其他人。 谢谢 下面是用法: 1 安装: # console window gem install change_log # environment.rb config.gem 'change_log' 或者 用 bundler # Gemfile gem 'change_log' # console window bundle install 2. Database Table 创建一个migration file: 注意: 名字可以随便起,只要在environment.rb里面重新声明就可以。 class AddChangeLog < ActiveRecord::Migration def self.up create_table :change_logs do |t| # feel free to choose another table name t.integer :version, :null=>false # store version of each change t.string :record_id,:limit=>30 # store the actual record id t.string :table_name, :limit=>60 # store the table name t.string :attribute_name,:limit=>60 # store the column name t.string :user, :limit=>20 # store the user who made the change t.string :action, :limit=>6 # store the change action: create, read, update, delete t.text :old_value # the value before change t.text :new_value # value after change t.string :field_type, :limit=>30 # the column type eg. date, text, varchar, int etc t.timestamps end end def self.down drop_table :change_logs end end 然后: #console window db:migrate 3. 应用 在你想要保存修改记录的model里加上这个: enable_change_log :ignore=>[:updated_at,:user_password] 用ignore来声明那些不想被保存的column. 在application controller 里加一个current_user 方法: def current_user return session[:user] # replace this with your own code end 这样的话,在controller 和helper里面的所有CRUD都会被记录下来。 如果,你在model中进行修改的话。 例如: # this is a model file def making_some_changes user = User.find(:first) user.website = 'www.iteye.com' user.save end 你可以用whodidit这个属性。这个是change_log自动添加进去的。 # this is a model file def making_some_changes user = User.find(:first) user.website = 'www.iteye.com' user.whodidit = 'javaeye' # 这样就可以了 user.save end 4. 列出已经保存的修改记录 用 ChangeLogs model,来调用修改记录。 # List all changes ChangeLogs.find(:all) # List all changes for table 'accounts' ChangeLogs.find(:all,:conditions=>['table_name = ?', 'accounts']) 5. 如果你想用别的表名。 那就修改migration文件。 然后在environment.rb里面声明: # config/environment.rb 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就修改了很多次。 再次感谢。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2011-01-25
还是非常支持的。
对于你的这个log表的设计,如果一次update操作中有改动过多个属性,那样会有多个记录,建议你用一个text记录将改动的属性记录在一起成ymal 的形式,这样不好一些吗? |
|
返回顶楼 | |
发表时间:2011-01-25
我开始自己写了一个filter加载全部的控制器上,来记录日志,最后发现不管成功或失败都给记录了。最后直接在需要监控的表上加了个触发器,方便了
|
|
返回顶楼 | |
发表时间:2011-01-26
对于在model中获得当前操作者,可以参考下 这个gem: https://github.com/grosser/record_activities
它是通过http://github.com/delynn/userstamp的这个来获得当前操作者的 |
|
返回顶楼 | |
发表时间:2011-02-02
rainchen 写道 对于在model中获得当前操作者,可以参考下 这个gem: https://github.com/grosser/record_activities
它是通过http://github.com/delynn/userstamp的这个来获得当前操作者的 谢谢,这两个东东应该很有用。 |
|
返回顶楼 | |
发表时间:2011-02-02
居然上了首页。。嘿嘿。不过最近javaeye很明显的少了很多人气。都过年去了吗?
|
|
返回顶楼 | |
发表时间:2011-02-14
啊,最近正需要这样的东西
|
|
返回顶楼 | |