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 未完待续

  • 相关阅读:
    事务传播机制,搞懂。
    洛谷 P1553 数字反转(升级版) 题解
    洛谷 P1200 [USACO1.1]你的飞碟在这儿Your Ride Is Here 题解
    洛谷 P1055 ISBN号码 题解
    洛谷 P2141 珠心算测验 题解
    洛谷 P1047 校门外的树 题解
    洛谷 P1980 计数问题 题解
    洛谷 P1008 三连击 题解
    HDU 1013 题解
    HDU 1012 题解
  • 原文地址:https://www.cnblogs.com/mahong-shaojiu-ruby/p/6146501.html
Copyright © 2011-2022 走看看