1. 12 1月, 2017 2 次提交
  2. 11 1月, 2017 1 次提交
  3. 10 1月, 2017 3 次提交
  4. 07 1月, 2017 2 次提交
  5. 05 1月, 2017 4 次提交
    • A
      5f03172f
    • A
      `self.` is not needed when calling its own instance method · 5473e390
      Akira Matsuda 提交于
      Actually, private methods cannot be called with `self.`, so it's not just redundant, it's a bad habit in Ruby
      5473e390
    • A
      This method is never called since 8e633e50 · d8e0282a
      Akira Matsuda 提交于
      d8e0282a
    • R
      Optimizing information_schema query for `foreign_keys` · 801a21e6
      Ryuta Kamizono 提交于
      Need `table_name` to avoid all databases scan.
      See https://dev.mysql.com/doc/refman/5.7/en/information-schema-optimization.html.
      
      ```
      > EXPLAIN SELECT fk.referenced_table_name AS 'to_table', fk.referenced_column_name AS 'primary_key', fk.column_name AS 'column', fk.constraint_name AS 'name', rc.update_rule AS 'on_update', rc.delete_rule AS 'on_delete' FROM information_schema.key_column_usage fk JOIN information_schema.referential_constraints rc USING (constraint_schema, constraint_name) WHERE fk.referenced_column_name IS NOT NULL AND fk.table_schema = 'activerecord_unittest' AND fk.table_name = 'fk_test_has_pk' AND rc.table_name = 'fk_test_has_pk'\G
      *************************** 1. row ***************************
                 id: 1
        select_type: SIMPLE
              table: fk
         partitions: NULL
               type: ALL
      possible_keys: NULL
                key: TABLE_SCHEMA,TABLE_NAME
            key_len: NULL
                ref: NULL
               rows: NULL
           filtered: NULL
              Extra: Using where; Open_full_table; Scanned 0 databases
      *************************** 2. row ***************************
                 id: 1
        select_type: SIMPLE
              table: rc
         partitions: NULL
               type: ALL
      possible_keys: NULL
                key: TABLE_NAME
            key_len: NULL
                ref: NULL
               rows: NULL
           filtered: NULL
              Extra: Using where; Open_full_table; Scanned 1 database; Using join buffer (Block Nested Loop)
      2 rows in set, 1 warning (0.00 sec)
      ```
      
      Fixes #27579.
      801a21e6
  6. 04 1月, 2017 12 次提交
  7. 03 1月, 2017 4 次提交
    • K
      Cache results of computing model type · cdf8a2b4
      Konstantin Lazarev 提交于
      We faced a significant performance decrease when we started using STI
      without storing full namespaced class name in type column (because of PostgreSQL
      length limit for ENUM types).
      We realized that the cause of it is the slow STI model instantiation. Problematic
      method appears to be `ActiveRecord::Base.compute_type`, which is used to find
      the right class for STI model on every instantiation.
      It builds an array of candidate types and then iterates through it calling
      `safe_constantize` on every type until it finds appropriate constant. So if
      desired type isn't the first element in this array there will be at least one
      unsuccessful call to `safe_constantize`, which is very expensive, since it's
      defined in terms of `begin; rescue; end`.
      
      This commit is an attempt to speed up `compute_type` method simply by caching
      results of previous calls.
      
      ```ruby
      class MyCompany::MyApp::Business::Accounts::Base < ApplicationRecord
        self.table_name = 'accounts'
        self.store_full_sti_class = false
      end
      
      class MyCompany::MyApp::Business::Accounts::Free < Base
      end
      
      class MyCompany::MyApp::Business::Accounts::Standard < Base
        # patch .compute_type there
      end
      
      puts '======================= .compute_type ======================='
      Benchmark.ips do |x|
        x.report("original method") do
          MyCompany::MyApp::Business::Accounts::Free.send :compute_type, 'Free'
        end
        x.report("with types cached") do
          MyCompany::MyApp::Business::Accounts::Standard.send :compute_type, 'Standard'
        end
        x.compare!
      end
      ```
      
      ```
      ======================= .compute_type =======================
        with types cached:  1529019.4 i/s
          original method:     2850.2 i/s - 536.46x  slower
      ```
      
      ```ruby
      5_000.times do |i|
        MyCompany::MyApp::Business::Accounts::Standard.create!(name: "standard_#{i}")
      end
      
      5_000.times do |i|
        MyCompany::MyApp::Business::Accounts::Free.create!(name: "free_#{i}")
      end
      
      puts '====================== .limit(100).to_a ======================='
      Benchmark.ips do |x|
        x.report("without .compute_type patch") do
          MyCompany::MyApp::Business::Accounts::Free.limit(100).to_a
        end
        x.report("with .compute_type patch") do
          MyCompany::MyApp::Business::Accounts::Standard.limit(100).to_a
        end
        x.compare!
      end
      ```
      
      ```
      ====================== .limit(100).to_a =======================
           with .compute_type patch:      360.5 i/s
        without .compute_type patch:       24.7 i/s - 14.59x  slower
      ```
      cdf8a2b4
    • R
      Counter cache touching don't need object finding anymore · 059a476c
      Ryuta Kamizono 提交于
      `current_time_from_proper_timezone` and timestamp attributes methods was
      pushed up to class method.
      059a476c
    • R
      Push `current_time_from_proper_timezone` and timestamp attributes methods up to class method · 77ff9a0a
      Ryuta Kamizono 提交于
      Actually these methods don't need instantiation.
      77ff9a0a
    • R
      Fix update counters of multiple records with touch: true · b177427d
      Ryuta Kamizono 提交于
      Currently does not work the following example in the doc:
      
      ```ruby
        # For the Posts with id of 10 and 15, increment the comment_count by 1
        # and update the updated_at value for each counter.
        Post.update_counters [10, 15], comment_count: 1, touch: true
        # Executes the following SQL:
        # UPDATE posts
        #    SET comment_count = COALESCE(comment_count, 0) + 1,
        #    `updated_at` = '2016-10-13T09:59:23-05:00'
        #  WHERE id IN (10, 15)
      ```
      b177427d
  8. 02 1月, 2017 8 次提交
  9. 01 1月, 2017 4 次提交
    • K
      Revert "Merge pull request #27528 from kamipo/extract_casted_booleans" · e42cbb7d
      Kasper Timm Hansen 提交于
      As pointed out by @matthewd this change makes ImmutableString aware
      of MysqlString's existence whereas previously MysqlString was only
      overriding public API.
      
      cc @kamipo
      
      This reverts commit e632c2fa, reversing
      changes made to 334a7dcf.
      e42cbb7d
    • J
      `meta-data` --> `metadata` · 5c72675c
      Jon Moss 提交于
      Removes space from the word; is now spelled in the standard way.
      
      [ci skip]
      5c72675c
    • R
      Change `timestamp_attributes_for_{create,update}` from symbol to string · 2b5dacb4
      Ryuta Kamizono 提交于
      `timestamp_attributes_for_{create,update}` is defined as symbol but
      always used as string with `to_s`. This allocates extra strings. To
      avoid extra allocation, change the definitions from symbol to string.
      
      ```ruby
      pp ObjectSpace::AllocationTracer.trace {
        1_000.times { |i|
          Post.create!
        }
      }
      ```
      
      Before:
      
      ```
      ["~/rails/activerecord/lib/active_record/timestamp.rb", 121]=>[1002, 0, 750, 0, 1, 18528],
      ["~/rails/activerecord/lib/active_record/timestamp.rb", 105]=>[1002, 0, 750, 0, 1, 7720],
      ["~/rails/activerecord/lib/active_record/timestamp.rb", 101]=>[1002, 0, 750, 0, 1, 7720],
      ["~/rails/activerecord/lib/active_record/timestamp.rb", 109]=>[1002, 0, 750, 0, 1, 13896],
      ["~/rails/activerecord/lib/active_record/timestamp.rb", 61]=>[4008, 0, 3000, 0, 1, 30880],
      ```
      
      After:
      
      ```
      ["~/rails/activerecord/lib/active_record/timestamp.rb", 120]=>[1000, 0, 756, 0, 1, 17184],
      ["~/rails/activerecord/lib/active_record/timestamp.rb", 104]=>[1000, 0, 756, 0, 1, 7160],
      ["~/rails/activerecord/lib/active_record/timestamp.rb", 100]=>[1000, 0, 756, 0, 1, 7160],
      ["~/rails/activerecord/lib/active_record/timestamp.rb", 108]=>[1000, 0, 756, 0, 1, 12888],
      ```
      2b5dacb4
    • R
      Refactor `CollectionAssociation#ids_reader` · 6ba7adba
      Ryuta Kamizono 提交于
      Simply we can do `target.pluck(reflection.association_primary_key)` if
      `target` is loaded.
      6ba7adba