Rails 数据迁移和模型里面 validate 区别

chengkai1853 · 2015年08月13日 · 最后由 chengkai1853 回复于 2015年08月17日 · 1667 次阅读

有几个问题:

1.在创建数据迁移文件的时候可以指定 unique: true 来判断该字段的唯一性,模型类的validates 的 uniqueness: true也可以判断唯一性,这两者怎么区别. 两者都可以确定belong_to, reference ,请问什么情况在数据库迁移时候判断,什么情况在模型类里面判断啊?

2.群组(Group),用户(User)如果该群组 group 有用户 current_user 就不让用户current_user再申请加入群。一般的做法是 @group.users.include? current_user,还是通过其他的方式来判断

3.问下数据库索引错误处理,我添加索引 add_index :applications , [:group_id,:user_id] , unique: true ,重复添加的时候会出现 ActiveRecord::RecordNotUnique 错误,在写程序的时候是代码逻辑避免这样数据库的错误出现,还是在这样错误出现的时候加入异常处理,如果是后者,一般是怎么做的?

4.最后,开始第一个写的rails项目就困难重重,求推荐一个好的开源rails项目,可以学习学习rails项目中遇到一些情况通常是怎么处理的。

共收到 7 条回复

1、区别很大。一个是数据库层面,比如,如果有 dba 直接往你数据库里任意插入记录,会破坏了你应用的数据完整。一个是你确保应用把数据正确的写入数据库。最好两个都要加上。

2、是的,建议你检查一下 sql ,确保在两条 sql 内完成这件事。

3、我习惯在代码里避免它发生,不抓取这种异常。可能也不是个好方法吧。

4、https://github.com/RailsApps 有很多源码可供参考,我也写了一份,不知道合不合用 https://github.com/liwei78/rails-practice-code/tree/master/final

https://github.com/ruby-china/ruby-china 也不错

unique: true 在rails migration中使用在index上(非index不起作用,mysql在使用ALTER TABLE TableName ADD UNIQUE (FieldName)时自动生成filed的index,保证uniq的性能),是数据库层面的uniq。如果插入重复值,会抛出:ActiveRecord::RecordNotUnique的MysqlError

uniqueness: true是rails的验证,执行过程是先查询然后根据查询结果执行其它逻辑。但是当两个不同的数据库连接同时操作时,可能会生成同样的数据,所以建议要在数据库中建uniq的索引。 既然mysql已经有了uniq的验证了,为什么还要使用rails uniquness呢?此处

如果重复值hit在rails身上,会产生一个验证错误。 如果漏过验证而hit在mysql身上,会产生一个数据库错误。 你感受一下。

可以通过Pessimistic Locking来避免ActiveRecord::RecordNotUnique.

#1楼 @liwei78 非常感谢啊,感觉自己在大大们的帮助下和之前相比成长了许多

#3楼 @mueven 谢谢,看到解释,非常有帮助,也让我想起了rails tutorial,里面好像有相关的处理。

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