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

本文介绍了一个用于Ruby on Rails项目的Change_Log Gem,它可以帮助开发者记录所有表中数据的变化情况,包括创建、更新和删除操作,以及执行这些操作的用户。通过简单的配置步骤,如安装、数据库迁移和模型设置,即可轻松启用此功能。
这几天把公司项目上的一些东西整理了整理,把能单独拿出来的东西都拿出来。写成gem,这样公司其他的项目就可以方便使用了。

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就修改了很多次。

再次感谢。
无界云图(开源在线图片编辑器源码)是由四川爱趣五科技推出的一款类似可画、创客贴、图怪兽的在线图片编辑器。该项目采用了React Hooks、Typescript、Vite、Leaferjs等主流技术进行开发,旨在提供一个开箱即用的图片编辑解决方案。项目采用 MIT 协议,可免费商用。 无界云图提供了一系列强大的图片编辑功能,包括但不限于: 素材管理:支持用户上传、删除和批量管理素材。 操作便捷:提供右键菜单,支持撤销、重做、导出图层、删除、复制、剪切、锁定、上移一层、下移一层、置顶、置底等操作。 保存机制:支持定时保存,确保用户的工作不会丢失。 主题切换:提供黑白主题切换功能,满足不同用户的视觉偏好。 多语言支持:支持多种语言,方便全球用户使用。 快捷键操作:支持快捷键操作,提高工作效率。 产品特色 开箱即用:无界云图采用了先进的前端技术,用户无需进行复杂的配置即可直接使用。 免费商用:项目采用MIT协议,用户可以免费使用和商用,降低了使用成本。 技术文档齐全:提供了详细的技术文档,包括技术文档、插件开发文档和SDK使用文档,方便开发者进行二次开发和集成。 社区支持:提供了微信技术交流群,用户可以在群里进行技术交流和问题讨论。 环境要求 Node.js:需要安装Node.js环境,用于运行和打包项目。 Yarn:建议使用Yarn作为包管理工具,用于安装项目依赖。 安装使用 // 安装依赖 yarn install // 动项目 yarn dev // 打包项目 yarn build 总结 无界云图是一款功能强大且易于使用的开源在线图片编辑器。它不仅提供了丰富的图片编辑功能,还支持免费商用,极大地降低了用户的使用成本。同时,详细的文档和活跃的社区支持也为开发者提供了便利的二次开发和集成件。无论是个人用户还是企业用户,都可以通过无界云图轻
学校新建了宿舍楼,共有 n 间寝室。等待分配的学生中,有女生 n 0 ​ 位、男生 n 1 ​ 位。所有待分配的学生都必须分到一间寝室。所有的寝室都要分出去,最后不能有寝室留空。 现请你程序完成寝室的自动分配。分配规则如下: 男女生不能混住; 不允许单人住一间寝室; 对每种性别的学生,每间寝室入住的人数都必须相同;例如不能出现一部分寝室住 2 位女生,一部分寝室住 3 位女生的情况。但女生寝室都是 2 人一间,男生寝室都是 3 人一间,则是允许的; 在有多种分配方案满足前面三项要求的情况下,要求两种性别每间寝室入住的人数差最小。 输入格式: 输入在一行中给出 3 个正整数 n 0 ​ 、n 1 ​ 、n,分别对应女生人数、男生人数、寝室数。数字间以空格分隔,均不超过 10 5 。 输出格式: 在一行中顺序输出女生和男生被分配的寝室数量,其间以 1 个空格分隔。行首尾不得有多余空格。 如果有解,题目保证解是唯一的。如果无解,则在一行中输出 No Solution。 输入样例 1: 24 60 10 输出样例 1: 4 6 注意:输出的方案对应女生都是 24/4=6 人间、男生都是 60/6=10 人间,人数差为 4。满足前三项要求的分配方案还有两种,即女生 6 间(都是 4 人间)、男生 4 间(都是 15 人间);或女生 8 间(都是 3 人间)、男生 2 间(都是 30 人间)。但因为人数差都大于 4 而不被采用。 输入样例 2: 29 30 10 输出样例 2: No Solution 感谢浙江警官职业学院楼满芳老师斧正数据! 代码长度限制 16 KB 时间限制 400 ms 内存限制 64 MB 栈限制 8192 KB
11-30
### 解决方案:寝室分配问题 #### 思路分析 我们需要在满足一系列约束件下,合理分配女生和男生的寝室数量。关键要求如下: 1. **男女生不能混住** → 女生和男生分开分配 2. **不允许单人住一间寝室** → 每间寝室至少 2 人 3. **同性别每间人数必须相同** → 女生全部是 $k$ 人间,男生全部是 $m$ 人间 4. **总寝室数恰好为 $n$** 5. **若有多种合方案,则选择男女每间人数差最小的那个** --- 我们设: - 女生寝室数为 $x$,则男生寝室数为 $n - x$ - 女生每人寝室人数为 $g = \frac{n_0}{x}$,必须是整数且 $\geq 2$ - 男生每人寝室人数为 $b = \frac{n_1}{n-x}$,也必须是整数且 $\geq 2$ 我们的目标是枚举所有可能的 $x$(从 1 到 $n-1$,因为两边都至少要有寝室),判断是否满足整除性和入住人数 ≥2 的件,并记录最优解(即 $|g - b|$ 最小) --- #### C语言实现代码 ```c #include <stdio.h> #include <stdlib.h> // 计算绝对值 int abs(int a) { return a >= 0 ? a : -a; } int main() { int n0, n1, n; // 女生人数、男生人数、寝室总数 scanf("%d %d %d", &n0, &n1, &n); int best_x = -1; // 最优女生寝室数 int min_diff = -1; // 当前最小的人数差 |g - b| // 枚举女生寝室数量 x(男生为 n - x) for (int x = 1; x <= n - 1; x++) { int y = n - x; // 男生寝室数 // 检查女生部分是否可整除,且每间至少2人 if (n0 % x != 0) continue; int girls_per_room = n0 / x; if (girls_per_room < 2) continue; // 检查男生部分是否可整除,且每间至少2人 if (n1 % y != 0) continue; int boys_per_room = n1 / y; if (boys_per_room < 2) continue; // 计算当前方案下每间人数之差 int diff = abs(girls_per_room - boys_per_room); // 更新最优解 if (best_x == -1 || diff < min_diff) { best_x = x; min_diff = diff; } } // 输出结果 if (best_x == -1) { printf("No Solution\n"); } else { printf("%d %d\n", best_x, n - best_x); } return 0; } ``` --- #### 代码解释 1. **输入处理**: - 读取 `n0`(女生人数)、`n1`(男生人数)、`n`(总寝室数) 2. **枚举策略**: - 遍历所有可能的女生寝室数量 $x \in [1, n-1]$,确保男生也有寝室($y = n - x \geq 1$) 3. **合性检查**: - 女生能否平均分配到 $x$ 个寝室?→ `n0 % x == 0` - 每间女生寝室人数是否 ≥2? - 同理对男生进行检查 4. **优化目标**: - 在所有合方案中,选择 `|girls_per_room - boys_per_room|` 最小的一个 - 使用 `min_diff` 跟踪最小差值,`best_x` 记录对应解 5. **输出**: - 若找到解,输出女生寝室数和男生寝室数 - 否则输出 `No Solution` --- #### 示例验证 **输入样例 1:** `24 60 10` - 枚举 $x$ 从 1 到 9: - $x=4$: $y=6$, 女生每间 $24/4=6$ 人,男生每间 $60/6=10$ 人 → 差为 4 ✅ - $x=6$: $y=4$, 女生 $24/6=4$, 男生 $60/4=15$ → 差为 11 - $x=8$: $y=2$, 女生 $24/8=3$, 男生 $60/2=30$ → 差为 27 - 其他情况不满足整除或人数不足2人 - 最小差为 4,对应 $x=4$, $y=6$ - 输出:`4 6` ✅ **输入样例 2:** `29 30 10` - 女生 29 人,是质数 → 只能分 1 或 29 间 - 但寝室只能分给 $x \in [1,9]$,所以尝试 $x=1$: $29/1=29$(合) - 此时男生 $y=9$, $30/9=3.33$ 不整除 ❌ - 其他 $x$ 都不能整除 29(如 $x=2$: 29%2≠0...) - 所以无解 → 输出 `No Solution` ✅ ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值