Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 对于Rails应用程序,我应该在DB和模型中进行验证吗?_Ruby On Rails_Validation - Fatal编程技术网

Ruby on rails 对于Rails应用程序,我应该在DB和模型中进行验证吗?

Ruby on rails 对于Rails应用程序,我应该在DB和模型中进行验证吗?,ruby-on-rails,validation,Ruby On Rails,Validation,我的背景是尽可能完整地定义DB模式,例如字段长度、非空值、默认值、复杂引用完整性等。对于Rails,我必须在模型中完成所有这些,以获得智能验证。那么,我是否也要复制数据库定义中的所有内容 例如,如果email是必填字段,我是否将验证:email,:presence=>true添加到模型中,并将:null=>false添加到迁移中 弦呢?如果模型中有:length=>{:maximum=>50},那么迁移中是否也需要:limit=>50 我是否向数据库添加外键以强制引用完整性 还是“Rails方式

我的背景是尽可能完整地定义DB模式,例如字段长度、非空值、默认值、复杂引用完整性等。对于Rails,我必须在模型中完成所有这些,以获得智能验证。那么,我是否也要复制数据库定义中的所有内容

例如,如果email是必填字段,我是否将
验证:email,:presence=>true
添加到模型中,并将
:null=>false
添加到迁移中

弦呢?如果模型中有
:length=>{:maximum=>50}
,那么迁移中是否也需要
:limit=>50

我是否向数据库添加外键以强制引用完整性


还是“Rails方式”在模型中尽可能多地执行操作,并将数据库作为“哑”持久化引擎?

明确地添加:null=>false。否则,您的DBA可能会伤害您。你的Rails应用程序并不是唯一一个触及DB的东西

最大长度为您提供增益DB内存。确定设置最大长度,但确保添加rails验证。如果不是,你可能会得到wierd应用程序错误


外键很好,但在rails应用程序中很少使用。通常,最好的做法是尽可能多地保留数据库中的逻辑。在迁移中添加可为null的验证并不会真正影响或有助于排除逻辑。如果您使用的是模型验证,那么您的大多数应用程序无论如何都应该通过模型验证。这在我的脑海里是洗过的

在这里你可以走得太远的是其他类型的约束。一些数据库支持各种疯狂的约束,这些约束作为验证器工作得更好——验证器更容易以自动化的方式测试和运行这些测试

如果您有许多涉及数据库的部分,但它们并不都是ruby,那么编写一个SOA层来完成所有验证和类似的代码通常是有用的。同样,在DB中测试代码比测试逻辑更容易。

标准的“Rails方式”是在Ruby代码中保留约束


我很少有奢侈的只有Rails(甚至只有Ruby)触摸DB。。。老实说,即使是直接在DB上乱搞的人也会造成问题。。。因此,我也倾向于使用DB约束,因为我不确定数据是否能够得到很好的整理。

Re。最大长度,我假设Rails创建的默认“variang(255)”使用与“variang(50)”相同的空间,只要只存储50个字符。风险(至少在我的MS SQL 2000天中)是,如果有人以某种方式添加更长的数据,字段长度之和可能会超过最大行长度。这三个答案都很有用。因为user458221首先回答了问题并解决了所有问题,所以我将检查这一点作为答案。听起来在完美的Rails世界中,不需要DB验证,但在现实世界中,额外的安全网是个好主意。作为个人偏好,我喜欢通过查看模式来理解应用程序的基本业务规则。