1. 16 10月, 2017 1 次提交
    • B
      Fix `bin/rails db:setup` and `bin/rails db:test:prepare` create wrong... · 99b2bf8d
      bogdanvlviv 提交于
      Fix `bin/rails db:setup` and `bin/rails db:test:prepare` create  wrong ar_internal_metadata's data for a test database.
      
        Before:
        ```
        $ RAILS_ENV=test rails dbconsole
        > SELECT * FROM ar_internal_metadata;
        key|value|created_at|updated_at
        environment|development|2017-09-11 23:14:10.815679|2017-09-11 23:14:10.815679
        ```
      
        After:
        ```
        $ RAILS_ENV=test rails dbconsole
        > SELECT * FROM ar_internal_metadata;
        key|value|created_at|updated_at
        environment|test|2017-09-11 23:14:10.815679|2017-09-11 23:14:10.815679
        ```
      
        Fixes #26731.
      99b2bf8d
  2. 15 10月, 2017 3 次提交
  3. 14 10月, 2017 2 次提交
  4. 11 10月, 2017 1 次提交
  5. 09 10月, 2017 8 次提交
  6. 08 10月, 2017 2 次提交
  7. 06 10月, 2017 1 次提交
  8. 05 10月, 2017 3 次提交
  9. 04 10月, 2017 3 次提交
  10. 30 9月, 2017 1 次提交
  11. 27 9月, 2017 5 次提交
    • R
      Add test case for `arel_attribute` with a custom table · 801ccab2
      Ryuta Kamizono 提交于
      Since #29301, `arel_attribute` respects a custom table name.
      801ccab2
    • T
      `Postgres::OID::Range` serializes to a `Range`, quote in `Quoting` · 51b6c342
      Thomas Cannon 提交于
      PostgreSQL 9.1+ introduced range types, and Rails added support for
      using this datatype in ActiveRecord. However, the serialization of
      `PostgreSQL::OID::Range` was incomplete, because it did not properly
      quote the bounds that make up the range. A clear example of this is a
      `tsrange`.
      
      Normally, ActiveRecord quotes Date/Time objects to include the
      milliseconds. However, the way `PostgreSQL::OID::Range` serialized its
      bounds, the milliseconds were dropped. This meant that the value was
      incomplete and not equal to the submitted value.
      
      An example of normal timestamps vs. a `tsrange`. Note how the bounds
      for the range do not include their milliseconds (they were present in
      the ruby Range):
      
          UPDATE "iterations" SET "updated_at" = $1, "range" = $2 WHERE
          "iterations"."id" = $3
          [["updated_at", "2017-09-23 17:07:01.304864"],
          ["range", "[2017-09-23 00:00:00 UTC,2017-09-23 23:59:59 UTC]"],
          ["id", 1234]]
      
      `PostgreSQL::OID::Range` serialized the range by interpolating a
      string for the range, which works for most cases, but does not work
      for timestamps:
      
          def serialize(value)
            if value.is_a?(::Range)
              from = type_cast_single_for_database(value.begin)
              to = type_cast_single_for_database(value.end)
              "[#{from},#{to}#{value.exclude_end? ? ')' : ']'}"
            else
              super
            end
          end
      
          (byebug) from = type_cast_single_for_database(value.begin)
          2010-01-01 13:30:00 UTC
      
          (byebug) to = type_cast_single_for_database(value.end)
          2011-02-02 19:30:00 UTC
      
          (byebug) "[#{from},#{to}#{value.exclude_end? ? ')' : ']'}"
          "[2010-01-01 13:30:00 UTC,2011-02-02 19:30:00 UTC)"
      
      @sgrif (the original implementer for Postgres Range support) provided
      some feedback about where the quoting should occur:
      
        Yeah, quoting at all is definitely wrong here. I'm not sure what I
        was thinking in 02579b56, but what this is doing is definitely in the
        wrong place. It should probably just be returning a range of
        subtype.serialize(value.begin) and subtype.serialize(value.end), and
        letting the adapter handle the rest.
      
      `Postgres::OID::Range` now returns a `Range` object, and
      `ActiveRecord::ConnectionAdapters::PostgreSQL::Quoting` can now encode
      and quote a `Range`:
      
          def encode_range(range)
            "[#{type_cast(range.first)},#{type_cast(range.last)}#{range.exclude_end? ? ')' : ']'}"
          end
      
          ...
      
          encode_range(range)
          #=> "['2010-01-01 13:30:00.670277','2011-02-02 19:30:00.745125')"
      
      This commit includes tests to make sure the milliseconds are
      preserved in `tsrange` and `tstzrange` columns
      51b6c342
    • R
      Remove unused `cached_columns` and `time_related_columns_on_topic` in `AttributeMethodsTest` · 25d3e733
      Ryuta Kamizono 提交于
      These are no longer used since 66736c8e.
      25d3e733
    • R
      Don't generate `foreign_type` if `options[:polymorphic]` is not given · 8d3bf8b6
      Ryuta Kamizono 提交于
      Because the reflection doesn't have `foreign_type` unless the
      association is a polymorphic association.
      8d3bf8b6
    • S
      Treat `Set` as an `Array` in `Relation#where` · 9cf7e349
      Sean Griffin 提交于
      I do not want to set the expectation that any enumerable object should
      behave this way, but this case in particular comes up frequently enough
      that I'm caving on this one.
      
      Fixes #30684.
      9cf7e349
  12. 26 9月, 2017 1 次提交
    • G
      PERF: Partially recover some performance when preloading. · e03c9066
      Guo Xiang Tan 提交于
      Benchmark Script:
      ```
      require 'active_record'
      require 'benchmark/ips'
      
      ActiveRecord::Base.establish_connection(ENV.fetch('DATABASE_URL'))
      ActiveRecord::Migration.verbose = false
      
      ActiveRecord::Schema.define do
        create_table :users, force: true do |t|
          t.string :name, :email
          t.integer :topic_id
          t.timestamps null: false
        end
      
        create_table :topics, force: true do |t|
          t.string :title
          t.timestamps null: false
        end
      end
      
      attributes = {
        name: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.',
        email: 'foobar@email.com'
      }
      
      class Topic < ActiveRecord::Base
        has_many :users
      end
      
      class User < ActiveRecord::Base
        belongs_to :topic
      end
      
      100.times do
        User.create!(attributes)
      end
      
      users = User.first(50)
      
      Topic.create!(title: 'This is a topic', users: users)
      
      Benchmark.ips do |x|
        x.config(time: 10, warmup: 5)
      
        x.report("preload") do
          User.includes(:topic).all.to_a
        end
      end
      ```
      
      Before:
      ```
      Calculating -------------------------------------
                   preload    40.000  i/100ms
      -------------------------------------------------
                   preload    407.962  (± 1.5%) i/s -      4.080k
      ```
      
      After:
      ```
      alculating -------------------------------------
                   preload    43.000  i/100ms
      -------------------------------------------------
                   preload    427.567  (± 1.6%) i/s -      4.300k
      ```
      e03c9066
  13. 25 9月, 2017 4 次提交
    • F
      Preload digest/sha2 to avoid thread safe error. · ff56fdb0
      Francesco Rodriguez 提交于
      I got this error in production using Puma in multi-threaded mode:
      
      ```
      RuntimeError: Digest::Base cannot be directly inherited in Ruby
      from active_support/security_utils.rb:23:in `variable_size_secure_compare'
      from active_support/security_utils.rb:23:in `hexdigest'
      from active_support/security_utils.rb:23:in `digest'
      ```
      
      Looks like Digest uses const_missing to load Digest::SHA256 (https://github.com/ruby/ruby/blob/trunk/ext/digest/lib/digest.rb#L8)
      
      - https://bugs.ruby-lang.org/issues/9494
      - https://github.com/ruby/ruby/commit/c02fa39463a0c6bf698b01bc610135604aca2ff4
      ff56fdb0
    • G
      PERF: Restore memoization when preloading associations. · 89711d99
      Guo Xiang Tan 提交于
      Benchmark Script
      
      ```
      require 'active_record'
      require 'benchmark/ips'
      require 'ruby-prof'
      require 'memory_profiler'
      require 'byebug'
      
      ActiveRecord::Base.establish_connection(ENV.fetch('DATABASE_URL'))
      ActiveRecord::Migration.verbose = false
      
      ActiveRecord::Schema.define do
        create_table :users, force: true do |t|
          t.string :name, :email
          t.integer :topic_id
          t.timestamps null: false
        end
      
        create_table :topics, force: true do |t|
          t.string :title
          t.timestamps null: false
        end
      end
      
      attributes = {
        name: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.',
        email: 'foobar@email.com'
      }
      
      class Topic < ActiveRecord::Base
        has_many :users
      end
      
      class User < ActiveRecord::Base
        belongs_to :topic
      end
      
      100.times do
        User.create!(attributes)
      end
      
      users = User.first(50)
      
      Topic.create!(title: 'This is a topic', users: users)
      
      Benchmark.ips do |x|
        x.config(time: 10, warmup: 5)
      
        x.report("preload") do
          User.includes(:topic).all.to_a
        end
      end
      ```
      
      Before
      
      ```
      Calculating -------------------------------------
                   preload    26.000  i/100ms
      -------------------------------------------------
                   preload    265.347  (± 3.0%) i/s -      2.652k
      ```
      
      After
      
      ```
      Calculating -------------------------------------
                   preload    39.000  i/100ms
      -------------------------------------------------
                   preload    406.053  (± 1.7%) i/s -      4.095k
      ```
      89711d99
    • A
      Unneeded Mocha stubs for Kernel#system · 40e495c1
      Akira Matsuda 提交于
      It's done inside each test via assert_called_with or Kernel.expects
      40e495c1
    • R
  14. 23 9月, 2017 4 次提交
  15. 22 9月, 2017 1 次提交