• select
      设备名称,
      count(1) 合计,
      sum(case 所在地 when '店1' then 1 else 0 end) 店1,
      sum(case 所在地 when '店2' then 1 else 0 end) 店2,
      sum(case 所在地 when '店3' then 1 else 0 end) 店3,
      sum(case 所在地 when '店4' then 1 else 0 end) 店4,
      sum(case 所在地 when '店5' then 1 else 0 end) 店5
    from
      基础表
    group by
      设备名称;
    
  • Ruby A PROGRAMMER'S BEST FRIEND

  • 看到这里还没笑,到底哪里是笑话了?

  • 前几天要改一个别人写的老方法,这个方法的上下文又比较多,全理清臣妾做不到,就是看测试代码理解这个方法的意图,通过跑测试确保我的改动没影响到别的功能。

    所以我认为测试用处一是确保你的代码符合整个项目的预期,二是给后来的维护者说明你要解决的问题(因为文档咱们是不会好好写的,哈哈。文档没有动力维护,但是为了跑通测试你会主动维护测试的)

  • 关于 block (一) at 2015年12月10日

    实现上面的功能我会这么写

    def test(your_proc, behaviors = {})
      user_ids = User.where("name like '%z%'").pluck(:id)
      User.where(id: user_ids).find_each{|x| x.update_columns(name: "name_#{x.id}")}
      your_proc.call()
      behaviors.each do |operate, behavior|
        case operate
        when :x
          behavior.call user_ids
        when :y
          behavior.call []
        else
          # default behavior
        end
      end
      puts 'done'
      true
    end
    
    # 调用
    result = test(
      ->{ puts 'this is ->' }, 
      {
        x: lambda {|user_ids| Rails.logger.debug "user_ids: #{user_ids}"}, 
        y: lambda {}
      }
    )
    

    方法作者只需要提供支持的 behaviors 说明就行了,如果你那种实现,你怎么给调用者写文档……

  • 关于 block (一) at 2015年12月10日

    这样耦合太紧了吧,我要是调用者我会疯的

  • windows 下还是用 vagrant 吧,不折腾

  • 如何研究一个 Gem 包? at 2015年11月17日

    看测试代码

  • 能不用 map 修改 hash 的 key? at 2015年11月12日

    data.map {|h| {name: h[:label], value: h[:data]}}

  • How Minitest works at 2015年11月03日

    问题1:Minitest::Test 是如何收集所有的测试类? 也可以用 ObjectSpace扫一下所有Minitest::Test子类达到效果 😉

  • 启动时加上-e production试一下

  • Rails 中的 blank? and present? at 2015年09月17日

    看了一下 rails 的实现,更简单……

    # File activesupport/lib/active_support/core_ext/object/blank.rb, line 15
    def blank?
      respond_to?(:empty?) ? !!empty? : !self
    end
    
  • Rails 中的 blank? and present? at 2015年09月17日
    [1] pry(main)> def blank? obj
    [1] pry(main)*   !obj || (obj.empty? rescue false)
    [1] pry(main)* end
    => :blank?
    [2] pry(main)> blank? nil
    => true
    [3] pry(main)> blank? false
    => true
    [4] pry(main)> blank? ""
    => true
    [5] pry(main)> blank?({})
    => true
    [6] pry(main)> blank? 0
    => false
    [7] pry(main)> blank? 0.0
    => false
    

    这样可以不

  • 语法错误是 Ruby 没法解析你的脚本,还没到抛异常呢。

  • 我猜是因为 每次bind生成一个新的对象可以做到一套Initializer配置可以被bind多次,供不同的context复用。

    不过只看railties下的代码也没有发现某个Initializerbind多次……

  • 关于方法调用的问题 at 2015年07月24日

    #4 楼 @cbdfocus

    module My_a
      def self.dosth
        puts "This is A do sth."
      end
    end
    
    class My
      def doit
        My_a::dosth
      end
    end
    
    obj0 = My.new
    obj0.doit
    
  • 关于方法调用的问题 at 2015年07月24日

    也可用prepend

    class My
      prepend My_a
      include My_b
    
      def doit
        dosth
    
      end
    end
    
    obj0 = My.new
    obj0.doit       # This is A do sth.
    
  • 字符串数组之间的转换 at 2015年02月02日

    str.scan('\w')或者str.scan(/(?<=').*(?=')/)

  • Private Class Method at 2015年01月08日

    #3 楼 @flypiggys attr_accessor 就是一个类的私有方法。

  • Private Class Method at 2015年01月08日

    也可以

    class Project
      def find(id)
      end
    
      def self.user
      end
    
      private_class_method :user
    end
    
  • a = [
      [2, 3, 4, 5],
      [3, 4, 5 ,6],
      [1, 2, 3, 2],
      [8, 9, 5, 3]
    ]
    
    b = [
      [1, 1, 1, 5],
      [4, 5, 2, 3],
      [6, 5, 6, 3],
      [7, 4, 9, 7]
    ]
    
    c = a.map.with_index do |aa, i|
      aa.map.with_index do |aaa, j|
        aaa > b[i][j] ? aaa : b[i][j]
      end
    end
    
  • 就是传了一个 hash

    class ABC
      def initialize params
        p params
      end
    end
    
  • http://www.ruby-doc.org/core-2.2.0/Array.html#method-i-sort

    Comparisons for the sort will be done using the <=> operator or using an optional code block.

    The block must implement a comparison between a and b, and return -1, when a follows b, 0 when a and b are equivalent, or +1 if b follows a.

  • 一道 ruby 笔试题 at 2014年12月23日

    #24 楼 @rocLv

    class A
      def initialize
        @a
        @b = 1
      end
    end
    
    A.new.instance_variables # [:@b]
    
    class B
      @a
      @b = 1
    end
    
    B.instance_variables # [:@b]
    
  • 一道 ruby 笔试题 at 2014年12月23日

    #21 楼 @rocLv def 里面的@v1跟类里面写的@v1不是同一个东西,前者是 C 的实例的实例变量,后者是 C 作为 Class 类实例的实例变量。如果要访问后者,可以C.instance_variable_get :@v1。只要知道在 Ruby 中,类也是一个对象就明白了。

  • spell check可发现很多类似的错误。

  • 没事的进来玩个游戏吧 at 2014年10月21日
    def mine total, max, left
      if total - max <= left
        total - left
      else
        mine total, max, left + max + 1
      end
    end
    

    策略就是上面方法,返回 0 就是必输局,必输局就让 AI 先手,然后。。。