1. 05 1月, 2019 23 次提交
  2. 04 1月, 2019 14 次提交
    • E
      Merge pull request #34797 from gsamokovarov/views-without-defined-protect-against-forgery · 9f092832
      Eileen M. Uchitelle 提交于
      Don't expect defined protect_against_forgery? in {token,csrf_meta}_tag
      9f092832
    • V
      Merge pull request #34862 from bogdanvlviv/fix-i18n-guide · de500027
      Vipul A M 提交于
      Fix example of I18n setting in the guide [ci skip]
      de500027
    • B
      Fix example of I18n setting in the guide [ci skip] · 939b85af
      bogdanvlviv 提交于
      Since #34356 logging `locale` value is more correct
      939b85af
    • E
      Merge pull request #34773 from eileencodes/share-fixture-connections-with-multiple-handlers · 725c6422
      Eileen M. Uchitelle 提交于
      For fixtures share the connection pool when there are multiple handlers
      725c6422
    • R
      Merge pull request #34858 from albertoalmagro/make-rails-compatible-accross-ruby-versions · a5a22c4e
      Ryuta Kamizono 提交于
      Make average compatible across ruby versions
      a5a22c4e
    • A
      Make average compatible accross Ruby versions · d237c7c7
      Alberto Almagro 提交于
      Since Ruby 2.6.0 NilClass#to_d is returning `BigDecimal` 0.0, this
      breaks `average` compatibility with prior Ruby versions. This patch
      makes `average` return `nil` in all Ruby versions when there are no
      rows.
      d237c7c7
    • A
      Revert "Fix NumericData.average test on ruby 2.6" · 3f2c8657
      Alberto Almagro 提交于
      This reverts commit 89b4612f.
      3f2c8657
    • R
      Merge pull request #34855 from bogdanvlviv/update-configuring-guide · 912db8bd
      Rafael França 提交于
      Update the "Configuring Rails Applications" guide [ci skip]
      912db8bd
    • B
      Update the "Configuring Rails Applications" guide [ci skip] · 4348b4af
      bogdanvlviv 提交于
      Add section "Results of `load_defaults`" to the guide.
      4348b4af
    • R
      7a4e20e0
    • R
      2x faster `connection.type_cast` · e9aa0c5c
      Ryuta Kamizono 提交于
      `nil`, `Numeric`, and `String` are most basic objects which are passed
      to `type_cast`. But now each `when *types_which_need_no_typecasting`
      evaluation allocates extra two arrays, it makes `type_cast` slower.
      
      The `types_which_need_no_typecasting` was introduced at #15351, but the
      method isn't useful (never used any adapters) since all adapters
      (sqlite3, mysql2, postgresql, oracle-enhanced, sqlserver) still
      overrides the `_type_cast`.
      
      Just expanding the method would make the `type_cast` 2x faster.
      
      ```ruby
      module ActiveRecord
        module TypeCastFast
          def type_cast_fast(value, column = nil)
            value = id_value_for_database(value) if value.is_a?(Base)
      
            if column
              value = type_cast_from_column(column, value)
            end
      
            _type_cast_fast(value)
          rescue TypeError
            to_type = column ? " to #{column.type}" : ""
            raise TypeError, "can't cast #{value.class}#{to_type}"
          end
      
          private
            def _type_cast_fast(value)
              case value
              when Symbol, ActiveSupport::Multibyte::Chars, Type::Binary::Data
                value.to_s
              when true       then unquoted_true
              when false      then unquoted_false
              # BigDecimals need to be put in a non-normalized form and quoted.
              when BigDecimal then value.to_s("F")
              when nil, Numeric, String then value
              when Type::Time::Value then quoted_time(value)
              when Date, Time then quoted_date(value)
              else raise TypeError
              end
            end
        end
      end
      
      conn = ActiveRecord::Base.connection
      conn.extend ActiveRecord::TypeCastFast
      
      Benchmark.ips do |x|
        x.report("type_cast") { conn.type_cast("foo") }
        x.report("type_cast_fast") { conn.type_cast_fast("foo") }
        x.compare!
      end
      ```
      
      ```
      Warming up --------------------------------------
                 type_cast    58.733k i/100ms
            type_cast_fast   101.364k i/100ms
      Calculating -------------------------------------
                 type_cast    708.066k (± 5.9%) i/s -      3.583M in   5.080866s
            type_cast_fast      1.424M (± 2.3%) i/s -      7.197M in   5.055860s
      
      Comparison:
            type_cast_fast:  1424240.0 i/s
                 type_cast:   708066.0 i/s - 2.01x  slower
      ```
      e9aa0c5c
    • R
      Merge pull request #34816 from bogdanvlviv/add-skip-action-mailbox-option-to-rails-new-cmd · c6ef670a
      Rafael Mendonça França 提交于
      Add `--skip-action-mailbox` option to `rails new`
      c6ef670a
    • E
      Share the connection pool when there are multiple handlers · b24bfcce
      Eileen Uchitelle 提交于
      In an application that has a primary and replica database the data
      inserted on the primary connection will not be able to be read by the
      replica connection.
      
      In a test like this:
      
      ```
      test "creating a home and then reading it" do
        home = Home.create!(owner: "eileencodes")
      
        ActiveRecord::Base.connected_to(role: :default) do
          assert_equal 3, Home.count
        end
      
        ActiveRecord::Base.connected_to(role: :readonly) do
          assert_equal 3, Home.count
        end
      end
      ```
      
      The home inserted in the beginning of the test can't be read by the
      replica database because when the test is started a transasction is
      opened byy `setup_fixtures`. That transaction remains open for the
      remainder of the test until we are done and run `teardown_fixtures`.
      
      Because the data isn't actually committed to the database the replica
      database cannot see the data insertion.
      
      I considered a couple ways to fix this. I could have written a database
      cleaner like class that would allow the data to be committed and then
      clean up that data afterwards. But database cleaners can make the
      database slow and the point of the fixtures is to be fast.
      
      In GitHub we solve this by sharing the connection pool for the replicas
      with the primary (writing) connection. This is a bit hacky but it works.
      Additionally since we define `replica? || preventing_writes?` as the
      code that blocks writes to the database this will still prevent writing
      on the replica / readonly connection. So we get all the behavior of
      multiple connections for the same database without slowing down the
      database.
      
      In this PR the code loops through the handlers. If the handler doesn't
      match the default handler then it retrieves the connection pool from the
      default / writing handler and assigns the reading handler's connections
      to that pool.
      
      Then in enlist_fixture_connections it maps all the connections for the
      default handler because all the connections are now available on that
      handler so we don't need to loop through them again.
      
      The test uses a temporary connection pool so we can test this with
      sqlite3_mem. This adapter doesn't behave the same as the others and
      after looking over how the query cache test works I think this is the
      most correct. The issues comes when calling `connects_to` because that
      establishes new connections and confuses the sqlite3_mem adapter. I'm
      not entirely sure why but I wanted to make sure we tested all adapters
      for this change and I checked that it wasn't the shared connection code
      that was causing issues - it was the `connects_to` code.
      b24bfcce
    • G
      Merge pull request #34706 from ChrisBr/instrumentation-guide · cc3cc6b5
      Gannon McGibbon 提交于
      Add missing keys to ActiveSupport#instrumentation guide [skip ci]
      cc3cc6b5
  3. 03 1月, 2019 3 次提交