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

lukertty · 2018年09月05日 · 最后由 hooopo 回复于 2018年09月14日 · 1525 次阅读
#  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

用 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

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