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

chengkai1853 · August 13, 2015 · Last by chengkai1853 replied at August 17, 2015 · 2114 hits

有几个问题:

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 项目中遇到一些情况通常是怎么处理的。

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,里面好像有相关的处理。

You need to Sign in before reply, if you don't have an account, please Sign up first.