• 彻底解决了

    /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
    
  • #19楼 @ywjno 需要手动写rake file,不过很简单的。 给你个参考 https://github.com/robbin/ruby_framework_bench/blob/master/grape_on_goliath/Rakefile (这个是robbin写的) 其实常见的framework都有ActiveRecord的相关库的: https://github.com/jhollinger/grape-activerecord How do I use ActiveRecord migrations?(Sinatra) http://www.sinatrarb.com/faq.html#ar-migrations

    这一部分其实我也只是一知半解,希望能有人来讲解下rake file的相关

  • 这些还是要配合ORM来使用啊,就ActiveRecord来说,active_record/railties/databases.rake 这个里面就定义了一组rake命令

  • #4楼 @wppurking npm与ruby的gem管理还不大一样吧。npm默认是没有全局依赖的,所有的依赖都是本地的,nodejs的package里面的依赖也是本地,所以应该不会出现版本冲突。