aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord
Commit message (Collapse)AuthorAgeFilesLines
* Don't expose internal `get_value`/`set_value` methodsRyuta Kamizono2018-10-182-11/+9
|
* Merge pull request #34197 from schneems/schneems/symbol-hash-respond_toRichard Schneeman2018-10-173-12/+11
|\ | | | | ActiveRecord#respond_to? No longer allocates strings
| * ActiveRecord#respond_to? No longer allocates stringsschneems2018-10-153-12/+11
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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?`.
* | Remove and flip `index: true` for `references` in the doc [ci skip]Ryuta Kamizono2018-10-172-8/+8
| | | | | | | | Follow up #32146.
* | Consolidate duplicated code that initializing an empty model objectRyuta Kamizono2018-10-172-20/+8
| | | | | | | | | | | | | | | | | | | | | | | | | | `init_with` and `init_from_db` are almost the same code except decode `coder`. And also, named `init_from_db` is a little misreading, a raw values hash from the database is already converted to an attributes object by `attributes_builder.build_from_database`, so passed `attributes` in that method is just an attributes object. I renamed that method to `init_with_attributes` since the method is shared with `init_with` to initialize an empty model object.
* | Consistently extract checking version for all adaptersRyuta Kamizono2018-10-174-27/+29
| | | | | | | | | | | | | | I don't prefer to extract it for one adapter even though all adapters also does. Related to #34227.
* | Merge pull request #34227 from bkuhlmann/master-lazy_mysql_version_check_supportAaron Patterson2018-10-161-4/+11
|\ \ | | | | | | Refactored abstract MySQL adapter to support lazy version check.
| * | Refactored abstract MySQL adapter to support lazy version check.Brooke Kuhlmann2018-10-161-4/+11
| |/ | | | | | | | | | | | | | | | | Will allow sub classes to override the protected `#check_version` method hook if desired. For example, this will be most helpful in sub classes that wish to support lazy initialization because the version check can be postponed until the connection is ready to be initialized.
* | Add regression test against habtm memoized singular_idsAlberto Almagro2018-10-161-0/+12
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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 19c8071 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.
* | Merge pull request #33075 from ↵Ryuta Kamizono2018-10-163-2/+22
|\ \ | |/ |/| | | | | | | fedxgibson/pg_ambigous_column_cache_key_limit_custom_select Fix Collection cache key with limit and custom select
| * Fix Collection cache key with limit and custom select (PG:AmbigousColumn: Error)Federico Martinez2018-10-153-2/+22
|/ | | | Change query to use alias name for timestamp_column to avoid ambiguity problems when using timestamp from subquery.
* Ensure to test that `project.developers` is ordered by `developers.name desc`Ryuta Kamizono2018-10-151-1/+1
| | | | | | | | | `developers.name desc` was added at d59f3a7, but any test case isn't failed even if the `developers.name desc` is removed since all tested developers are consistently ordered on both `name` and `id`. I changed one developers creation ordering to ensure to test that `project.developers` is ordered by `developers.name desc`.
* Improve model attribute accessor method names for backtracesDylan Thacker-Smith2018-10-123-53/+21
| | | | | | | | 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.
* Basic API for connection switchingEileen Uchitelle2018-10-104-1/+328
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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 ```
* Merge pull request #34110 from ↵Eileen M. Uchitelle2018-10-103-0/+33
|\ | | | | | | | | albertoalmagro/enum-raises-on-invalid-definition-values Enum raises on invalid definition values
| * Privatize ENUM_CONFLICT_MESSAGE constantAlberto Almagro2018-10-101-0/+1
| |
| * Raise on invalid definition valuesAlberto Almagro2018-10-103-0/+32
| | | | | | | | | | | | | | | | | | When defining a Hash enum it can be easy to use [] instead of {}. This commit checks that only valid definition values are provided, those can be a Hash, an array of Symbols or an array of Strings. Otherwise it raises an ArgumentError. Fixes #33961
* | Merge pull request #34137 from gmcgibbon/db_migrate_status_multi_dbEileen M. Uchitelle2018-10-101-1/+15
|\ \ | |/ |/| Add multi-db support to rails db:migrate:status
| * Add multi-db support to rails db:migrate:statusGannon McGibbon2018-10-091-1/+15
| |
* | Merge pull request #34122 from kamipo/generate_relation_methodsRyuta Kamizono2018-10-106-5/+59
|\ \ | | | | | | Generate delegation methods to named scope in the definition time
| * | Generate delegation methods to named scope in the definition timeRyuta Kamizono2018-10-096-5/+59
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The delegation methods to named scope are defined when `method_missing` is invoked on the relation. Since #29301, the receiver in the named scope is changed to the relation like others (e.g. `default_scope`, etc) for consistency. Most named scopes would be delegated from relation by `method_missing`, since we don't allow scopes to be defined which conflict with instance methods on `Relation` (#31179). But if a named scope is defined with the same name as any method on the `superclass` (e.g. `Kernel.open`), the `method_missing` on the relation is not invoked. To address the issue, make the delegation methods to named scope is generated in the definition time. Fixes #34098.
* | | Merge pull request #34094 from ↵Ryuta Kamizono2018-10-107-3/+111
|\ \ \ | | | | | | | | | | | | | | | | christophemaximin/fix-activerecord-clearing-of-query-cache Fix inconsistent behavior by clearing QueryCache when reloading associations
| * | | Clear QueryCache when reloading associationsChristophe Maximin2018-10-107-3/+111
| | | |
* | | | Call `load_schema` before `assert_no_queries`Ryuta Kamizono2018-10-101-0/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | Follow up 45be690f8e6db019aac6198ba49d608a2e14824b. `predicate_builder.build` in `where` requires `load_schema` for `type_for_attribute`.
* | | | Fix odd indentationRyuta Kamizono2018-10-101-10/+10
| | | |
* | | | Refactor Arel visitor to use `collect_nodes_for` as much as possibleRyuta Kamizono2018-10-101-33/+10
| |_|/ |/| |
* | | Improve DELETE with JOIN handling to avoid subqueries if possibleRyuta Kamizono2018-10-102-9/+8
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Before: ``` Pet Destroy (0.8ms) DELETE FROM `pets` WHERE `pets`.`pet_id` IN (SELECT `pet_id` FROM (SELECT DISTINCT `pets`.`pet_id` FROM `pets` LEFT OUTER JOIN `toys` ON `toys`.`pet_id` = `pets`.`pet_id` WHERE `toys`.`name` = ?) AS __active_record_temp) [["name", "Bone"]] ``` After: ``` Pet Destroy (1.0ms) DELETE `pets` FROM `pets` LEFT OUTER JOIN `toys` ON `toys`.`pet_id` = `pets`.`pet_id` WHERE `toys`.`name` = ? [["name", "Bone"]] ```
* | | Merge pull request #34081 from gmcgibbon/db_migrate_status_moveEileen M. Uchitelle2018-10-093-13/+39
|\ \ \ | | | | | | | | Move db:migrate:status to DatabaseTasks method
| * | | Move db:migrate:status to DatabaseTasks methodGannon McGibbon2018-10-083-13/+39
| | | |
* | | | Merge pull request #34117 from ↵Ryuta Kamizono2018-10-101-0/+2
|\ \ \ \ | |_|_|/ |/| | | | | | | | | | | | | | | | | | | aergonaut/docs/ActiveRecord--Persistence-belongs_to_touch_method Add docs to ActiveRecord::Persistence#belongs_to_touch_method [ci skip]
| * | | Add docs to ActiveRecord::Persistence#belongs_to_touch_methodChris Fung2018-10-071-0/+2
| | | | | | | | | | | | | | | | [ci skip]
* | | | Call `define_attribute_methods` before `assert_no_queries` to address CI ↵Ryuta Kamizono2018-10-095-9/+80
| |/ / |/| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | flakiness Follow up 45be690f8e6db019aac6198ba49d608a2e14824b. Somehow calling `define_attribute_methods` in `build`/`new` sometimes causes the `table_exists?` query. To address CI flakiness due to `assert_no_queries` failure, ensure `define_attribute_methods` before `assert_no_queries`.
* | | [ci skip] Fix typoFrancesco Rodríguez2018-10-081-1/+1
| | |
* | | Don't expose internal methods in the associationsRyuta Kamizono2018-10-082-32/+32
| | |
* | | Fix test name to add missing "set"Ryuta Kamizono2018-10-081-1/+1
| | |
* | | Fix `AssociationRelation` not to set inverse instance key just like beforeRyuta Kamizono2018-10-073-3/+23
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Since #31575, `set_inverse_instance` replaces the foreign key by the current owner immediately to make it happen when a record is added to collection association. But `set_inverse_instance` is not only called when a record is added, but also when a record is loaded from queries. And also, that loaded records are not always associated records for some reason (using `or`, `unscope`, `rewhere`, etc). It is hard to distinguish whether or not we should invoke `set_inverse_instance`, but at least we should avoid the undesired side-effect which was brought from #31575. Fixes #34108.
* | | Merge pull request #34076 from gmcgibbon/fixtures_refactorEileen M. Uchitelle2018-10-074-243/+376
|\ \ \ | | | | | | | | Fixtures refactor
| * | | Move FixtureSet::ReflectionProxy and FixtureSet::HasManyThroughProxy to ↵Gannon McGibbon2018-10-052-32/+32
| | | | | | | | | | | | | | | | FixtureSet::TableRows
| * | | Introduce FixtureSet::TableRows and FixtureSet::TableRowGannon McGibbon2018-10-053-88/+183
| | | |
| * | | Introduce FixtureSet::ModelMetadataGannon McGibbon2018-10-052-29/+49
| | | |
| * | | Small refactors to FixtureSet::ClassCache and FixtureGannon McGibbon2018-10-051-9/+8
| | | |
| * | | Move FixtureSet.create_fixtures reading and inserting sections into private ↵Gannon McGibbon2018-10-051-41/+58
| | | | | | | | | | | | | | | | methods
| * | | Organize FixtureSet class methodsGannon McGibbon2018-10-051-102/+104
| | | |
* | | | add test for cache_version precisionLachlan Sylvester2018-10-071-31/+55
|/ / /
* | / Exercise stringify of database configurationsbogdanvlviv2018-10-051-0/+5
| |/ |/| | | | | | | | | | | | | | | | | | | | | | | Since #33968 we stringify keys of database configuration This commit adds more assertions in order to ensure that and prevent any regression in the future. Currently, if remove `to_s` added in #33968 from `env_name.to_s` on the line (activerecord/lib/active_record/database_configurations.rb:107), there is no test that would fail. One of the added assertions should emphasize why we need this `to_s`. Follow up #33968
* | Remove `ignore_none: false` to assert no queries more strictlyRyuta Kamizono2018-10-057-31/+31
| | | | | | | | Follow up 811be477786455d144819a5e9fbb7f9f54b8da69.
* | Use `assert_no_queries` not to ignore BEGIN/COMMIT queriesRyuta Kamizono2018-10-0513-38/+37
| | | | | | | | | | | | | | | | | | `test_update_does_not_run_sql_if_record_has_not_changed` would pass without #18501 since `assert_queries` ignores BEGIN/COMMIT unless `ignore_none: true` is given. Since #32647, empty BEGIN/COMMIT is ommited. So we no longer need to use `assert_queries(0)` to ignore BEGIN/COMMIT in the queries.
* | Simplify the condition in `prepare_update_statement`Ryuta Kamizono2018-10-051-8/+2
| |
* | Restore `preloaders_for_one` methodRyuta Kamizono2018-10-051-5/+9
| | | | | | | | Since the above comment is for the `preloaders_for_one`.
* | failing test for eager loadingMatt Jones2018-10-041-0/+5
| | | | | | | | cherry-picked from https://github.com/rails/rails/pull/33763