zoukankan      html  css  js  c++  java
  • rails active record 使用default_scope is evil, 记一次 order not work 的排查

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

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

      查询最新更新的行, 结果发现无论如何都无法获取到正确的数据, 无论是 order('id DESC') 还是 order('id ASC') 最后获得的数据都是一样的

      

      随机查看mysql产生的语句, 

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

      无论怎样查询语句一直有个 txt ASC, 导致查询语句无法正常工作。

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

       default_scope { order('txt ASC') }

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

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

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

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

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

      TODO 未完待续

  • 相关阅读:
    大文件上传插件
    大文件上传解决方案
    up7-文件保存位置
    up6-自定义文件存储路径
    up7.1-asp.net-本地测试教程
    文件上传控件产品比较
    IIS支持解析json
    IE8控件安装方法
    IE9控件安装方法
    gets()函数详解和缺陷
  • 原文地址:https://www.cnblogs.com/mahong-shaojiu-ruby/p/6146501.html
Copyright © 2011-2022 走看看