# 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 比较容易收集错误信息,而且不用访问数据库。 数据库异常不好处理错误信息,而且耗费了网络请求。
嗯嗯,我主要想问问 validates 可以偷懒用别人写的吗,每次启动可以根据 schema 生成就好了
某个字段需要限制为 50 个字符,很多时候需要在多个地方定义相同的规则
比如比较常见的地方
我目前为止是在三个地方都写相同的规则,感觉确实比较繁琐 但是因为他们处于不同的层 (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