如何将belongs_to升级为两倍的工作速度(database_validations gem)

在本文中,我将说明为什么您需要使用来自database_validations db_belongs_to而不是通常的belongs_to


我敢肯定你们大多数人都熟悉ORM ActiveRecord的 belongs_to 。 但是您知道吗,在模型中使用belongs_to初始化连接也会增加对连接是否存在的验证。 这是因为默认情况下, belongs_to具有optional: false选项。


因此,每次保存新对象或更新现有对象时,都对每个链接执行一个附加的SQL SELECT查询。


例子


 class User < ActiveRecord::Base belongs_to :company belongs_to :country end user = User.first user.update(some_field: 'something') #        SELECT,  ,   `company`  `country`  

您还应该知道,这种方法不能保证数据库的完整性,因为 链接可以稍后删除(在后续或并行请求中),而不会出现任何问题。


 user.update(...) user.company.destroy! =>     ,  ,          ,       (     ) 

要解决此问题,可以将相应的外键约束添加到数据库中。 有此限制,您将始终确保此连接存在。


性能如何? 如果已经确定将保持数据完整性(使用外键约束),为什么需要对数据库进行SELECT查询?


答案很简单-不需要。 但是为了使之成为可能,我们需要解决处理ActiveRecord::InvalidForeignKey异常的问题,该异常在我们尝试保存不在数据库中的连接时得到。 为了具有与belongs_to相同的行为,这是必需的,以便errors包括相同的错误。


为了不自己编写所有处理程序, database_validations gem将派上用场。 这个gem已经包含了validates_db_uniqueness_of ,人们喜欢(它是中心上的帖子 ),现在具有db_belongs_to ,这在您的项目中很容易实现。 db_belongs_to可以提高性能并确保数据完整性。


该方法为您做一些事情:


  • 在应用程序启动期间检查数据库中是否存在正确的外键约束;
  • 解析数据库异常,并为对象的errors提供适当的错误;
  • 消除了对数据库执行额外的SQL查询的需要;

我建议您在项目中使用database_validations 。 该宝石已经在生产环境中进行了测试,并被证明是非常好的。 尽管易于实施,但它可以极大地提高项目的性能,因为 使用的次数越多,保存的内容就越多 ,有关详细信息,请查看组基准


欢迎任何反馈! 我们感谢对项目的任何贡献!

Source: https://habr.com/ru/post/zh-CN431734/


All Articles