• @lidashuang 单指你这个例子,会用,并且对 belongs_to API 熟练才好维护,如果是不熟练的人写出的真不一定好维护,因为大家对越魔性的代码理解偏差越大。例如 Sidekiq 的 delay 方法,很简单但也很神奇,用着用着可能发现解决问题花的时间比这个方法因为省下的时间更多的:https://github.com/mperham/sidekiq/issues/2211

  • Mini SQL 支持 MySQL 了 at 2019年09月23日

    关闭讨论功能可以考虑加一步确认,好像挺多帖子点错的😀

  • 少代码一般来说意味着更好维护,但是由于少代码也意味着高抽象,需要更熟练的人才能使用的更好,所以最终好不好维护还是要看使用者😀

  • 开发环境:

    开发环境是惰性加载,Shop 常量一开始不存在,所以会触发 const_missing,使用 Rails 的自动加载机制。加载的顺序是:Api::BooksController::Shop -> Api::Shop(找到了) -> Shop,然后继续自动加载常量 Event,顺序:Api::Shop::Event -> API::Event -> Event,最终没找到,抛出异常

    生产环境:

    因为生产环境预先把所有 autoload 目录下的文件都加载过了,这里没有触发 const_missing,使用的是 Ruby 自身的常量查找。查找顺序是:Api::BooksController::Shop -> Shop(找到了)(这里没有 Api::Shop 是因为你定义 controller 的方式没有开启新的命名空间)。然后加载 Event 常量,得到 Shop::Event。

    要彻底解决这类问题的话,我认为最好不要在自动加载类中使用限定常量(Rails 对于限定常量的加载处理不太好理解)。

    首先把 controller 的限定常量改成相对常量定义:

    module Api
      class BooksController < ApplicationController # 使用相对常量代替限定常量
        ...
      end
    end
    

    那么两种加载方式就一致了,生产环境也会报错了。解决这第二个问题的话,把另外一个限定常量改成绝对常量就好了。

    # app/controllers/api/books_controller.rb
    module Api
      class BooksController < ApplicationController # 使用相对常量代替限定常量
        def self.test
          ::Shop::Event.test # 使用绝对常量代替限定常量
        end
      end
    end
    
  • 如果你有个 Api::Shop 这个常量就会出现这样的问题,Rails 限定常量加载有点问题。

  • 有时候会需要用到一些白板类,这些类不继承自 Object,这时候如果你想调用 Kernel 的某些方法的话,就要用到 singleton method 了

  • def print_half_diamond(lines, width: 5)
      cycle = width * 2 - 2
      return lines.times { puts '*' } if cycle.zero?
      lines.times do |line|
        index = line % cycle + 1
        count = index <= width ? index : width * 2 - index
        puts '*' * count
      end
    end
    
  • 新年快乐,祝大家万事如意🎈 🎈

  • 不行

  • 实现不了的,没办法统一添加,只能为每一个需要修改核心方法的类添加 using 语句。

    Refinements 作用域只有顶级、Module 和 Class,且遇到 end 就停止了,不能用在 Method 上。

    You may activate refinements at top-level, and inside classes and modules. You may not activate refinements in method scope. Refinements are activated until the end of the current class or module definition, or until the end of the current file if used at the top-level.