1. 06 11月, 2018 1 次提交
    • E
      Fix inspect with non-primary key id attribute · 65cd0fda
      Eugene Kenny 提交于
      The `read_attribute` method always returns the primary key when asked to
      read the `id` attribute, even if the primary key isn't named `id`, and
      even if another attribute named `id` exists.
      
      For the `inspect`, `attribute_for_inspect` and `pretty_print` methods,
      this behaviour is undesirable, as they're used to examine the internal
      state of the record. By using `_read_attribute` instead, we'll get the
      real value of the `id` attribute.
      65cd0fda
  2. 03 11月, 2018 4 次提交
  3. 01 11月, 2018 1 次提交
  4. 31 10月, 2018 4 次提交
  5. 30 10月, 2018 1 次提交
  6. 29 10月, 2018 2 次提交
  7. 27 10月, 2018 4 次提交
  8. 26 10月, 2018 2 次提交
    • B
      Partly revert #31819 · bf6dc7a7
      bogdanvlviv 提交于
      The PR#31819 changed `#preloaders_on` and added some test,
      then #33938 reverted changes that were added to the method in #31819.
      Since changes in the method were reverted and as mentioned in the
      comment https://github.com/rails/rails/pull/31819#discussion_r221847481
      that titles of the tests added in #31819 don't reflect implementation I
      think we can remove those test for now.
      bf6dc7a7
    • B
      `assert_called_with` should require `args` argument · 9d0cf520
      bogdanvlviv 提交于
      There are two main reasons why `assert_called_with` should require
      `args` argument:
      
      1) If we want to assert that some method should be called and we don't
         need to check with which arguments it should be called then we should use
         `assert_called`.
      
      2) `assert_called_with` without `args` argument doesn't assert anything!
         ```ruby
         assert_called_with(@object, :increment) do
            @object.decrement
         end
         ```
         It causes false assertions in tests that could cause regressions in the project.
      
      I found this bug by working on
      [minitest-mock_expectations](https://github.com/bogdanvlviv/minitest-mock_expectations) gem.
      This gem is an extension for minitest that provides almost the same method call
      assertions.
      I was wondering whether you would consider adding "minitest-mock_expectations"
      to `rails/rails` instead of private `ActiveSupport::Testing::MethodCallAssertions` module.
      If yes, I'll send a patch - https://github.com/bogdanvlviv/rails/commit/a970ecc42c3a9637947599f2c13e3762e4b59208
      9d0cf520
  9. 25 10月, 2018 3 次提交
  10. 24 10月, 2018 2 次提交
    • R
      Lazy checking whether or not values in IN clause are boundable · ce40073c
      Ryuta Kamizono 提交于
      Since #33844, eager loading/preloading with too many and/or too large
      ids won't be broken by pre-checking whether the value is constructable
      or not.
      
      But the pre-checking caused the type to be evaluated at relation build
      time instead of at the query execution time, that is breaking an
      expectation for some apps.
      
      I've made the pre-cheking lazy as much as possible, that is no longer
      happend at relation build time.
      ce40073c
    • O
      Fix typo of duplicated `the` [ci skip] · 7217179d
      ohbarye 提交于
      7217179d
  11. 23 10月, 2018 2 次提交
    • F
      Hide PG::Connection from API docs [ci skip] · 0e038e17
      Francesco Rodríguez 提交于
      0e038e17
    • Y
      MySQL 8.0.13 raises `ER_NO_REFERENCED_ROW` and `ER_ROW_IS_REFERENCED` · 26369bbe
      Yasuo Honda 提交于
      when user has no parent table access privileges
      
      Refer https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-13.html#mysqld-8-0-13-errors
      
      >>
      * Previously, the ER_NO_REFERENCED_ROW_2 and ER_ROW_IS_REFERENCED_2 error messages
      for foreign key operations were displayed and revealed information about parent tables,
      even when the user had no parent table access privileges. Error handling for this situation has been revised:
      
        * If the user does have table-level privileges for all parent tables,
          ER_NO_REFERENCED_ROW_2 and ER_ROW_IS_REFERENCED_2 are displayed, the same as before.
      
        * If the user does not have table-level privileges for all parent tables,
          more generic error messages are displayed instead (ER_NO_REFERENCED_ROW and ER_ROW_IS_REFERENCED).
      <<
      
      This pull request addresses these 3 failures:
      
      ```ruby
      $ ARCONN=mysql2 bundle exec ruby -w -Itest test/cases/adapter_test.rb -n /foreign/
      Using mysql2
      Run options: -n /foreign/ --seed 14251
      
      F
      
      Failure:
      ActiveRecord::AdapterForeignKeyTest#test_foreign_key_violations_are_translated_to_specific_exception_with_validate_false [test/cases/adapter_test.rb:348]:
      [ActiveRecord::InvalidForeignKey] exception expected, not
      Class: <ActiveRecord::StatementInvalid>
      Message: <"Mysql2::Error: Cannot add or update a child row: a foreign key constraint fails: INSERT INTO `fk_test_has_fk` (`fk_id`) VALUES (1231231231)">
      
      ... snip ...
      
      rails test test/cases/adapter_test.rb:343
      
      F
      
      Failure:
      ActiveRecord::AdapterForeignKeyTest#test_foreign_key_violations_on_delete_are_translated_to_specific_exception [test/cases/adapter_test.rb:368]:
      [ActiveRecord::InvalidForeignKey] exception expected, not
      Class: <ActiveRecord::StatementInvalid>
      Message: <"Mysql2::Error: Cannot delete or update a parent row: a foreign key constraint fails: DELETE FROM fk_test_has_pk WHERE pk_id = 1">
      
      ... snip ...
      
      rails test test/cases/adapter_test.rb:365
      
      F
      
      Failure:
      ActiveRecord::AdapterForeignKeyTest#test_foreign_key_violations_on_insert_are_translated_to_specific_exception [test/cases/adapter_test.rb:358]:
      [ActiveRecord::InvalidForeignKey] exception expected, not
      Class: <ActiveRecord::StatementInvalid>
      Message: <"Mysql2::Error: Cannot add or update a child row: a foreign key constraint fails: INSERT INTO fk_test_has_fk (fk_id) VALUES (0)">
      
      ... snip ...
      
      rails test test/cases/adapter_test.rb:357
      
      Finished in 0.087370s, 34.3366 runs/s, 34.3366 assertions/s.
      3 runs, 3 assertions, 3 failures, 0 errors, 0 skips
      $
      ```
      26369bbe
  12. 21 10月, 2018 1 次提交
    • E
      Reduce string allocations in read/write_attribute · ffc9ed3d
      Eugene Kenny 提交于
      When `attr_name` is passed as a symbol, it's currently converted to a
      string by `attribute_alias?`, and potentially also `attribute_alias`,
      as well as by the `read_attribute`/`write_attribute` method itself.
      
      By converting `attr_name` to a string up front, the extra allocations
      related to attribute aliases can be avoided.
      ffc9ed3d
  13. 19 10月, 2018 1 次提交
    • Y
      Implement AR#inspect using ParamterFilter. · 32b03b46
      Yoshiyuki Kinjo 提交于
      AR instance support `filter_parameters` since #33756.
      Though Regex or Proc is valid as `filter_parameters`,
      they are not supported as AR#inspect.
      
      I also add :mask option and #filter_params to
      `ActiveSupport::ParameterFilter#new` to implement this.
      32b03b46
  14. 18 10月, 2018 1 次提交
  15. 17 10月, 2018 4 次提交
  16. 16 10月, 2018 3 次提交
    • A
      Add regression test against habtm memoized singular_ids · 5e92770e
      Alberto Almagro 提交于
      Starting in Rails 5.0.0 and still present in Rails 5.2.1, `singular_ids`
      got memoized and didn't reload after more items were added to the
      relation.
      
      Although 19c80718 happens to fix the issue, it only adds tests for
      `has_many` relations while this bug only affected
      `has_and_belongs_to_many` relations.
      
      This commit adds a regression test to ensure it never happens again with
      `habtm` relations.
      
      Ensures #34179 never gets reproduced.
      5e92770e
    • F
      Fix Collection cache key with limit and custom select (PG:AmbigousColumn: Error) · b1aeae04
      Federico Martinez 提交于
      Change query to use alias name for timestamp_column to avoid ambiguity problems when using timestamp from subquery.
      b1aeae04
    • S
      ActiveRecord#respond_to? No longer allocates strings · f45267bc
      schneems 提交于
      This is an alternative to https://github.com/rails/rails/pull/34195
      
      The active record `respond_to?` method needs to do two things if `super` does not say that the method exists. It has to see if the "name" being passed in represents a column in the table. If it does then it needs to pass it to `has_attribute?` to see if the key exists in the current object. The reason why this is slow is that `has_attribute?` needs a string and most (almost all) objects passed in are symbols.
      
      The only time we need to allocate a string in this method is if the column does exist in the database, and since these are a limited number of strings (since column names are a finite set) then we can pre-generate all of them and use the same string. 
      
      We generate a list hash of column names and convert them to symbols, and store the value as the string name. This allows us to both check if the "name" exists as a column, but also provides us with a string object we can use for the `has_attribute?` call. 
      
      I then ran the test suite and found there was only one case where we're intentionally passing in a string and changed it to a symbol. (However there are tests where we are using a string key, but they don't ship with rails).
      
      As re-written this method should never allocate unless the user passes in a string key, which is fairly uncommon with `respond_to?`.
      
      This also eliminates the need to special case every common item that might come through the method via the `case` that was originally added in https://github.com/rails/rails/commit/f80aa5994603e684e3fecd3f53bfbf242c73a107 (by me) and then with an attempt to extend in https://github.com/rails/rails/pull/34195.
      
      As a bonus this reduces 6,300 comparisons (in the CodeTriage app homepage) to 450 as we also no longer need to loop through the column array to check for an `include?`.
      f45267bc
  17. 15 10月, 2018 1 次提交
  18. 13 10月, 2018 1 次提交
    • D
      Improve model attribute accessor method names for backtraces · 99c87ad2
      Dylan Thacker-Smith 提交于
      Ruby uses the original method name, so will show the __temp__ method
      name in the backtrace. However, in the common case the method name
      is compatible with the `def` keyword, so we can avoid the __temp__
      method name in that case to improve the name shown in backtraces
      or TracePoint#method_id.
      99c87ad2
  19. 11 10月, 2018 1 次提交
    • E
      Basic API for connection switching · 31021a8c
      Eileen Uchitelle 提交于
      This PR adds the ability to 1) connect to multiple databases in a model,
      and 2) switch between those connections using a block.
      
      To connect a model to a set of databases for writing and reading use
      the following API. This API supercedes `establish_connection`. The
      `writing` and `reading` keys represent handler / role names and
      `animals` and `animals_replica` represents the database key to look up
      the configuration hash from.
      
      ```
      class AnimalsBase < ApplicationRecord
        connects_to database: { writing: :animals, reading: :animals_replica }
      end
      ```
      
      Inside the application - outside the model declaration - we can switch
      connections with a block call to `connected_to`.
      
      If we want to connect to a db that isn't default (ie readonly_slow) we
      can connect like this:
      
      Outside the model we may want to connect to a new database (one that is
      not in the default writing/reading set) - for example a slow replica for
      making slow queries. To do this we have the `connected_to` method that
      takes a `database` hash that matches the signature of `connects_to`. The
      `connected_to` method also takes a block.
      
      ```
      AcitveRecord::Base.connected_to(database: { slow_readonly: :primary_replica_slow }) do
        ModelInPrimary.do_something_thats_slow
      end
      ```
      
      For models that are already loaded and connections that are already
      connected, `connected_to` doesn't need to pass in a `database` because
      you may want to run queries against multiple databases using a specific
      role/handler.
      
      In this case `connected_to` can take a `role` and use that to swap on
      the connection passed. This simplies queries - and matches how we do it
      in GitHub. Once you're connected to the database you don't need to
      re-connect, we assume the connection is in the pool and simply pass the
      handler we'd like to swap on.
      
      ```
      ActiveRecord::Base.connected_to(role: :reading) do
        Dog.read_something_from_dog
        ModelInPrimary.do_something_from_model_in_primary
      end
      ```
      31021a8c
  20. 10 10月, 2018 1 次提交