新手问题 大家是如何处理 Rails 应用的 Model 层和数据库层的数据校验的?

lukertty · 2018年09月05日 · 最后由 hooopo 回复于 2018年09月14日 · 582 次阅读
#  redpack_employee_name(员工姓名)       :string(50)

比如说数据库层面已经限制这个字段只能为50个字符的长度,那么Model层是否还需要加一句

validates :redpack_employee_name, length: { maximum: 50 }

我找了几个工具,帮忙自动根据 schema 生成所有的 validates,不过好像star不多,是不是有另外的推荐的做法?

https://github.com/SchemaPlus/schema_validations

https://github.com/rubiety/validates_lengths_from_database

共收到 7 条回复

用 validates 比较容易收集错误信息,而且不用访问数据库。
数据库异常不好处理错误信息,而且耗费了网络请求。

Rei 回复

嗯嗯,我主要想问问validates可以偷懒用别人写的吗,每次启动可以根据schema生成就好了😜

某个字段需要限制为50个字符,很多时候需要在多个地方定义相同的规则

比如比较常见的地方

  • 数据库里面
  • model类里面
  • 前端的验证里面

我目前为止是在三个地方都写相同的规则,感觉确实比较繁琐
但是因为他们处于不同的层(layer)里面,分离是必然的

以前有想过定义一个validation的验证规则放到json之类的文件里面
然后写个script自动生成相关的代码,但感觉有点麻烦就放弃了

不知道大家有什么好办法

数据库目前用唯一索引来保证唯一性,其他都在model层做验证。。。

目的不太一样。Model里能做更复杂的验证,有友好的报错。数据库是为了在守住关键底线,限制功能要弱一些。

如果你这个字段,不存在并发访问等绕过Model的情况,你可以不做数据库层面限制。

数据库和Model之间共享validation可以用 Sequel解决 https://sequel.jeremyevans.net/rdoc-plugins/classes/Sequel/Plugins/AutoValidations.html

前端和后端之间可以用Swagger(openAPI)共享validation。

关注点不同

数据库的vslidation是数据完整性约束的最后保障

model的validation是为了错误回显

model层可以做的更多,但并不是所有类型都可以做完善,比如唯一性,而数据库层面要做的话有些比较复杂,想做的画可以用Check Constraints

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