rails active record 使用default_scope is evil, 记一次 order not work 的排查

  源于一次BUG,有一张表后期添加了 updated_at 时间戳, 而后想要查询最近一次更新的行的 updated_at, 而后果断mysql

  MyModel.order('id DESC').where.not(updated_at: nil).limit(1).first.idsql

  查询最新更新的行, 结果发现不管如何都没法获取到正确的数据, 不管是 order('id DESC') 仍是 order('id ASC') 最后得到的数据都是同样的google

  

  随机查看mysql产生的语句, spa

  SELECT  `mymodels`.* FROM `words` WHERE (`mymodels`.`updated_at` IS NOT NULL)  ORDER BY txt ASC, id DESC LIMIT 1插件

  不管怎样查询语句一直有个 txt ASC, 致使查询语句没法正常工做。it

 

  忽然想起久远前为了使用分页插件, 使用了 ActiveRecord 的 default_scope 选项: class

   default_scope { order('txt ASC') }date

  这将致使每次查询的时候执行  default_scope 中传入的行为。 model

 

  default_scope 的使用就是万恶的根源, 可是之前有很多逻辑实际上依赖了这个特性的使用, 又不能改只能OTL,  不过还好能够使用 MyModel.unsope 选项来关闭这个特性分页

  MyModel.unscoped.order('id DESC').where.not(updated_at: nil).limit(1).first.id

  产生出来的 sql 语句终于正常了

 

  又多google了一下, 发现这个特性确实是一个很糟糕的东西:

  TODO 未完待续

相关文章
相关标签/搜索