• WebSocket 方案选择 at 2019年05月10日

    为什么不试试 go 呢?我们目前的做法是通过 go 来保持 go 长链接。

  • 文档上写了 “Set uses Hash as storage, so you must note the following points:”

  • ruby 我觉得推广难的两个原因:

    1. 没有简单好用的 ruby for windows。
    2. 过分强调 ruby on rails。Ror 对于新手真的是太不友好了,大量的 dsl 让人摸不着头脑。 但是但就 ruby 本身而言,ruby 的语法是很适合做新手推广和教学的(如果能解决 ruby for windows 就更好了)
  • 彻底解决了

    /active_support/core_ext/object/json.rb 这个文件给 Time 类加了 as_json 的函数:

    class Time
      def as_json(options = nil) #:nodoc:
        if ActiveSupport::JSON::Encoding.use_standard_json_time_format
          xmlschema(ActiveSupport::JSON::Encoding.time_precision)
        else
          %(#{strftime("%Y/%m/%d %H:%M:%S")} #{formatted_offset(false)})
        end
      end
    end
    

    具体在 Time 的 xmlschema 函数里会根据是否是 utc 时间来给出不同的格式,这里会直接 format,并不会调用 to_s

    def xmlschema(fraction_digits=0)
        fraction_digits = fraction_digits.to_i
        s = strftime("%FT%T")
        if fraction_digits > 0
          s << strftime(".%#{fraction_digits}N")
        end
        s << (utc? ? 'Z' : strftime("%:z"))
      end
    

    同样,关于 to_s 我也查看了对应的源代码(这部分代码写在 C 里,是拿不到 source 的),同样会根据是否是 utc 时间来返回不同的格式。

      static VALUE
    time_to_s(VALUE time)
    {
        struct time_object *tobj;
    
        GetTimeval(time, tobj);
        if (TIME_UTC_P(tobj))
            return strftimev("%Y-%m-%d %H:%M:%S UTC", time, rb_usascii_encoding());
        else
            return strftimev("%Y-%m-%d %H:%M:%S %z", time, rb_usascii_encoding());
    }
    
  • 那篇文章我通过 google 搜到过,看过了,并不能解决我的疑问

    2.4.1 :005 > PlayRecord.last.created_at.method(:to_s).source_location
     => ["/Users/ilike/.rvm/gems/ruby-2.4.1/gems/activesupport-5.0.3/lib/active_support/core_ext/time/conversions.rb", 49] 
    2.4.1 :008 >   Time.now.method(:to_s).source_location
     => ["/Users/ilike/.rvm/gems/ruby-2.4.1/gems/activesupport-5.0.3/lib/active_support/core_ext/time/conversions.rb", 49] 
    2.4.1 :009 > Time.now.to_s
     => "2017-08-25 22:37:01 +0800" 
    2.4.1 :010 > PlayRecord.last.created_at.to_s
     => "2017-08-25 13:13:28 UTC" 
    2.4.1 :011 > PlayRecord.last.created_at.class==Time.now.class
     => true 
    
    
    

    源代码里的这部分是

    def to_formatted_s(format = :default)
       if formatter = DATE_FORMATS[format]
         formatter.respond_to?(:call) ? formatter.call(self).to_s : strftime(formatter)
       else
         to_default_s
       end
     end
     alias_method :to_default_s, :to_s
     alias_method :to_s, :to_formatted_s
    

    两个一样的类,同一个函数,返回的结果是不一样的,这个让我有点迷惑

  • 我看了下 activesupport 中关于 time 的 源码 看起来也没有改动 to_s 的默认行为啊

    def to_formatted_s(format = :default)
        if formatter = DATE_FORMATS[format]
          formatter.respond_to?(:call) ? formatter.call(self).to_s : strftime(formatter)
        else
          to_default_s
        end
      end
      alias_method :to_default_s, :to_s
      alias_method :to_s, :to_formatted_s
    
    
  • 我们一直在用 grape,裸 grape,跑在 unicorn 上,有想过用 goliath,但是没跑起来,赶时间就一直拖到现在。 可以介绍下如何跑在 goliath 上么

  • +1

  • #3 楼 @13684054420

    class Employee
        before_create  :set_category
        def set_category
          self.employee_category = self.employee.category.display_name
        end
    end
    
    class EmployeeImport
        Employee.skip_callback(:create,:before,:set_category)
        Employee.create(hash)
        Employee.set_callback(:create,:before,:set_category)
    end
    
  • 使用 skip_callback 和 set_callback

    Model.skip_callback(:create,:before,:do_something)
    Model.set_callback(:create,:before,:do_something)
    

    或者是这样

    class Writer < Person
               skip_callback :validate, :before, :check_membership, if: -> { self.age > 18 }
    end