天天看点

开发新手最容易犯的50个 Ruby on Rails 错误(1)

顺带说一句,你根本想不到,有多少人愿意来参加并学习 rails 编程!

在分析了所有受训者编写的代码之后,我们总结了50个最常见的错误!更糟糕的是,每个小组所犯的错误与前一组的错误几乎一模一样。

以下是 rails 新手常常忽略或做错的地方。我们还包含了“对“,”错”两个版本的代码样本,使得教程更为清楚。

通常,rails 和许多 gems 会为它们使用的对象添加一些有用的帮助方法。例如,rails 会自动为布尔字段添加声明。通常,这些方法的名字是以问号结尾的。请牢记这一点!

了解 orm 如何与数据库交互是非常重要的。但是,新手往往没有这种了解。因此,他们很少使用 “includes”、“preload” 与 “eager_load” 这类方法,并且对 “bullet” gem 一无所知。

在第一个例子中,n+1 查询会传递至数据库。”n” 是已经完成的家庭作业数量。查询数量可能是10、20甚至100。而在第二个例子中,只有2个查询!

scopes 允许你隐藏数据库的实现,并将代码唯一化(uniqualize)。而且,代码的可读性也会大幅提升,因为他们透露了开发者的意图,而非数据库的结构。

模型的数据,包括其在 “after_create” 中的新 id,可以从内部,而非外部进行读取,原因是交易尚未完成。

如果我在数据库中创建了一条记录,之后打算将其 id 放入 redis 或任意的存储中,会得到以下结果:

如果 id 在交易完成之前使用,“after_create” 可能会导致无效数据。

借助 “sidekiq” 或其他任意后台工作,我总是可以使用 “after_commit” 确保数据的完整性。

尽管使用对象无疑非常方便,但整个过程却非常缓慢,而且需要很多内存。新手们可能并不理解代码的工作原理,以及如何提高其效率。

在被移除之前,“dependent destroy” 会选择所有受限记录,建立其对象,并调用各自的毁灭方法。此方法允许你移除所有受限数据。但是,当涉及大量数据时,这种方法就不管用了。

至于 “dependent delete_all”,它会通过一条 sql 查询移除自己。它效率很高,但是,在这种情况下,你得自己考虑数据库的完整性。

根据协议,将 bang(!) 添加至方法名的情况有如下两种:

如果某个方法修改了其访问的对象

如果某个方法在执行失败后抛出了异常

新手们常常忽略第二种情况。如果代码出了问题,你必须尽快找到问题根源。例如,如果完全不处理将记录保存至数据库的结果,最好还是抛出异常以找到哪段代码处理了无效数据。

在上例中,如果一个无效的物品传给输入,就会被忽视。

如果字段中的某个模型必须要有一个默认值,应该通过数据库进行安装。

对于基础架构的限制条件越多,我们的应用就会越可靠。此外,别忘记 “null:false”,用户不可以没有简介。

如果不能回滚,迁移的意义在哪儿?

以上是新手们最常犯的 ruby on rails 错误的第一部分,如果喜欢本文,请记得分享哦。

未完待续……