aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib
Commit message (Collapse)AuthorAgeFilesLines
* handle passing in primary key to unique_by, and handle primary keys missing ↵Lachlan Sylvester2019-08-051-2/+4
| | | | indexes
* Fix `PG::ConnectionBad` error when running fixtureseileencodes2019-08-021-6/+11
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | At first this appeared to be a multi-db bug but after some invesitgation it was clear that this can occur just by calling `establish_connection` from ApplicationRecord. After some investigation we found that this only occurred when using fixtures. The console boots fine, the server runs fine, and the tests even run fine if we used paralellization or eager loading in the tests. I tracked the issue down to the line that calls `self.connection_specification_name = name` in the SchemaMigration changes for Rails 6.0. But how can this be? That is not that major of a change? How could `connection_specification_name` be a problem? First `connection_specification_name` caches the name of the connection specificatio. Second, fixtures were incorrectly holding onto a reference to that connection. So when you went to run the tests the models wouldn't be connected and when the fixtures tried to load the data it would choke on that unconnected database. The changes here move the connection into a lambda so we can call it when we need it rather than blowing up before the model is connected. Fixes #36743 Co-authored-by: Aaron Patterson <aaron.patterson@gmail.com>
* Add ability to unset preventing writeseileencodes2019-08-022-7/+9
| | | | | | | | | | | Previously if an app attempts to do a write inside a read request it will be impossilbe to switch back to writing to the primary. This PR adds an argument to the `while_preventing_writes` so that we can make sure to turn it off if we're doing a write on a primary. Fixes #36830 Co-authored-by: John Crepezzi <john.crepezzi@gmail.com>
* Introduce InvalidConfigurationErroreileencodes2019-08-011-3/+7
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | In our app at work we had a faked config like this: ``` { "foo" => :bar, "bar" => { "adapter" => "memory" } } ``` This config is invalid. You can't say for foo env just have a symbol, nor would this work if you had fa foo env with just a string. A configuration must be a url or an adapter or a database. Otherwise it's invalid and we can't parse it. When this was just yaml turned into hashes you could get away with passing whatever. It wouldn't work but it wouldn't blow up either. Now that we're using objects we were returning `nil` for these but that just means we either blow up on `for_current_env` or compact the `nil`'s. I think it's a better user experience to not build the configs and raise an appropriate error. This is also an invalid config because if you do pass a string here it should be a URL. ``` { "foo" => "bar", "bar" => { "adapter" => "memory" } } ```
* Deduplicate joins valuesRyuta Kamizono2019-08-021-3/+3
| | | | | | | | | #36805 have one possible regression that failing deduplication if `joins_values` have complex order (e.g. `joins_values = [join_node_a, :comments, :tags, join_node_a]`). This fixes the deduplication to take it in the first phase before grouping.
* No private defRafael Mendonça França2019-08-011-1/+2
|
* It may be better to explicitly require 'object/try' where we call `try`Akira Matsuda2019-08-013-0/+4
| | | | | | In most cases it works now without explicit require because it's accidentally required through active_support/core_ext/date_and_time/calculations.rb where we still call `try`, but that would stop working if we changed the Calculations implementation and remove the require call there.
* Use `try` only when we're unsure if the receiver would respond_to the methodAkira Matsuda2019-08-015-5/+5
|
* Merge pull request #36827 from akshaymohite/fix-documentation-typo-in-exampleVipul A M2019-08-011-1/+1
|\ | | | | Fixed a typo in documentation example of activerecord database configuration. [ci skip]
| * Fixed a typo in documentation example of activerecord database ↵Akshay Mohite2019-08-011-1/+1
| | | | | | | | | | | | configuration. [ci skip] - The example has sqlite3 adpater in database.yml, whereas configuration object had incorrectly specified mysql2 in documentation.
* | Fix db:seedeileencodes2019-07-311-0/+2
|/ | | | | | | | | | | | | | | | | | | The `rake db:seed` command was broken for the primary environment if the application is using multiple databases. We never implemented `rake db:seed` for other databases (coming soon), but that shouldn't break the default case. The reason this was broken was because `abort_if_pending_migrations` would loop through the configs for all databases and check for migrations but would leave the last established connection. So `db:seed` was looking in the wrong database for the table to seed. This PR doesn't fix the fact that `db:seed` doesn't work for multiple databases but does fix the default case. Fixes #36817 Co-authored-by: John Crepezzi <john.crepezzi@gmail.com>
* Address to rubocop offencesRyuta Kamizono2019-07-311-1/+1
|
* Reduce Array allocationsAkira Matsuda2019-07-311-2/+2
|
* Merge pull request #36708 from ↵Kasper Timm Hansen2019-07-312-12/+11
|\ | | | | | | | | rails/has-one-polymorphic-touch-dont-cache-association-result-inside-create-transaction Polymorphic has_one touch: Don't cache association result inside crea…
| * Polymorphic has_one touch: Reset association cache result after create ↵Kasper Timm Hansen2019-07-312-12/+11
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | transaction In case of a polymorphic association there's no automatic inverse_of to assign the inverse record. So to get the record there needs to be a query executed, however, if the query fires within the transaction that's trying to create the associated record, no record can be found. And worse, the nil result is cached on the association so after the transaction commits the record can't be found. That's what happens if touch is enabled on a polymorphic has_one association. Consider a Comment with a commentable association that needs to be touched. For `Comment.create(commentable: Post.new)`, the existing code essentially does `commentable.send(:comment)` within the create transaction for the comment and thus not finding the comment. Now we're purposefully clearing the cache in case we've tried accessing the association within the transaction and found no object. Before: ``` kaspth-imac 2.6.3 ~/code/rails/activerecord master *= ARCONN=postgresql bin/test test/cases/associations/has_one_associations_test.rb -n /commit/ Using postgresql Run options: -n /commit/ --seed 46022 D, [2019-07-19T03:30:37.864537 #96022] DEBUG -- : Chef Load (0.2ms) SELECT "chefs".* FROM "chefs" WHERE "chefs"."employable_id" = $1 AND "chefs"."employable_type" = $2 LIMIT $3 [["employable_id", 1], ["employable_type", "DrinkDesignerWithPolymorphicTouchChef"], ["LIMIT", 1]] D, [2019-07-19T03:30:37.865013 #96022] DEBUG -- : Chef Create (0.2ms) INSERT INTO "chefs" ("employable_id", "employable_type") VALUES ($1, $2) RETURNING "id" [["employable_id", 1], ["employable_type", "DrinkDesignerWithPolymorphicTouchChef"]] D, [2019-07-19T03:30:37.865201 #96022] DEBUG -- : TRANSACTION (0.1ms) RELEASE SAVEPOINT active_record_1 D, [2019-07-19T03:30:37.874136 #96022] DEBUG -- : TRANSACTION (0.1ms) ROLLBACK D, [2019-07-19T03:30:37.874323 #96022] DEBUG -- : TRANSACTION (0.1ms) ROLLBACK F Failure: HasOneAssociationsTest#test_polymorphic_has_one_with_touch_option_on_create_wont_cache_assocation_so_fetching_after_transaction_commit_works [/Users/kaspth/code/rails/activerecord/test/cases/associations/has_one_associations_test.rb:716]: --- expected +++ actual @@ -1 +1 @@ -#<Chef id: 1, employable_id: 1, employable_type: "DrinkDesignerWithPolymorphicTouchChef", department_id: nil, employable_list_type: nil, employable_list_id: nil> +nil ``` After: ``` kaspth-imac 2.6.3 ~/code/rails/activerecord master *= ARCONN=postgresql bin/test test/cases/associations/has_one_associations_test.rb -n /commit/ Using postgresql Run options: -n /commit/ --seed 46022 D, [2019-07-19T03:30:22.479387 #95973] DEBUG -- : Chef Create (0.3ms) INSERT INTO "chefs" ("employable_id", "employable_type") VALUES ($1, $2) RETURNING "id" [["employable_id", 1], ["employable_type", "DrinkDesignerWithPolymorphicTouchChef"]] D, [2019-07-19T03:30:22.479574 #95973] DEBUG -- : TRANSACTION (0.1ms) RELEASE SAVEPOINT active_record_1 D, [2019-07-19T03:30:22.482051 #95973] DEBUG -- : Chef Load (0.1ms) SELECT "chefs".* FROM "chefs" WHERE "chefs"."employable_id" = $1 AND "chefs"."employable_type" = $2 LIMIT $3 [["employable_id", 1], ["employable_type", "DrinkDesignerWithPolymorphicTouchChef"], ["LIMIT", 1]] D, [2019-07-19T03:30:22.482317 #95973] DEBUG -- : TRANSACTION (0.1ms) ROLLBACK D, [2019-07-19T03:30:22.482437 #95973] DEBUG -- : TRANSACTION (0.1ms) ROLLBACK . Finished in 0.088498s, 11.2997 runs/s, 22.5994 assertions/s. 1 runs, 2 assertions, 0 failures, 0 errors, 0 skips ``` Notice the select now fires after the commit.
* | Accessing ivar with Symbols might be just a very little bit better than with ↵Akira Matsuda2019-07-311-5/+5
| | | | | | | | fstrings
* | Preserve user supplied joins order as much as possibleRyuta Kamizono2019-07-301-16/+30
| | | | | | | | | | | | | | | | | | | | | | | | | | | | Currently, string joins are always applied as last joins part, and Arel join nodes are always applied as leading joins part (since #36304), it makes people struggled to preserve user supplied joins order. To mitigate this problem, preserve the order of string joins and Arel join nodes either before or after of association joins. Fixes #36761. Fixes #34328. Fixes #24281. Fixes #12953.
* | Move DatabaseAlreadyExists detection to DB adapterJohn Hawthorn2019-07-296-13/+10
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Previously it was the responsibility of the database tasks to translate the invalid statement from creating a duplicate database into an ActiveRecord::Tasks::DatabaseAlreadyExists error. It's actually easier for us to do this detection inside of the adapter, where we already do a case statement on the return code to translate the error. This commit introduces ActiveRecord::DatabaseAlreadyExists, a subclass of StatementInvalid, and updates both AbstractMysqlAdapter and PostgresqlAdapter to return this more specific exception in that case. Because this is a subclass of the old exception, StatementInvalid, it should be backwards compatible with any code expecting that from create_database. This works for both create_database and exectute("CREATE DATABASE")
* | Enabled matches_regex for MySqlJames Pearson2019-07-291-0/+8
| | | | | | | | | | | | | | | | | | | | | | | | | | Previously matches_regex was only availble on PostgreSql, this will enable it for MySql Usage example: users = User.arel_table; users = User.arel_table; User.where(users[:email].matches_regexp('(.*)\@gmail.com')) Update activerecord/test/cases/arel/visitors/mysql_test.rb Co-Authored-By: Ryuta Kamizono <kamipo@gmail.com>
* | Use match? where we don't need MatchDataAkira Matsuda2019-07-291-1/+1
| |
* | Merge pull request #36303 from gaotongfei/feature/ignore-specified-fixturesRafael França2019-07-272-4/+47
|\ \ | | | | | | Allow specifying fixtures to be ignored in "_fixture" section
| * | Allow specify fixtures to be ignoredTongfei Gao2019-07-272-4/+47
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Allow specifying what fixtures can be ignored by setting `ignore` in fixtures YAML file: # users.yml _fixture: ignore: - base base: &base admin: false introduction: "This is a default description" admin: <<: *base admin: true visitor: <<: *base In the above example, "base" fixture will be ignored when creating users fixture. This is helpful when you want to inherit attributes and it makes your fixtures more "DRY".
* | | Update links to new MySQL server errors reference page [ci skip]Carlos Antonio da Silva2019-07-272-2/+2
|/ /
* | Use match? where we don't need MatchDataAkira Matsuda2019-07-274-4/+4
| | | | | | | | We're already running Performance/RegexpMatch cop, but it seems like the cop is not always =~ justice
* | Merge pull request #36773 from seejohnrun/db-configuration-separate-env-varsEileen M. Uchitelle2019-07-261-1/+8
|\ \ | | | | | | Allow separate database env variables per-connection
| * | Allow separate database env variables per-connectionJohn Crepezzi2019-07-261-1/+8
| |/ | | | | | | | | | | | | | | | | | | | | This commit adds a feature which allows separate database ENV variables to be defined for each spec in a 3-tier config. The names for the environment variables will be `#{name.upcase}_DATABASE_URL` This commit also introduces a change in behavior around handling of `DATABASE_URL`. Instead of using `DATABASE_URL` to change _all_ specs in a multi-database configuration, it will now only affect the `primary` connection.
* | Merge pull request #36776 from ↵Rafael França2019-07-261-1/+1
|\ \ | | | | | | | | | | | | giraffate/fix_join_middle_table_alias_when_using_HABTM Fix join middle table alias when using HABTM
| * | Fix join middle table alias when using HABTMTakayuki Nakata2019-07-261-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | In using HABTM, join middle table alias is combined with the associated models name without sort, while middle table name is combined with those models name with sort. Fixes #36742.
* | | Merge pull request #36372 from instructure-bridge/6-0-stableRafael França2019-07-261-3/+13
| |/ |/| | | Don't break configurations.each, .first before the deprecation period
* | Only merge DATABASE_URL settings into the current envJohn Crepezzi2019-07-251-18/+20
| | | | | | | | | | | | | | This commit fixes a regression where when the `DATABASE_URL` environment variable was set and the current Rails environment had a valid configuration defined in the database config, settings from the environment variable would affect _all_ environments (not just the current one).
* | Merge pull request #36766 from jhawthorn/call_connection_error_numberJohn Hawthorn2019-07-251-1/+1
|\ \ | | | | | | Use connection.error_number in MySQLDatabaseTasks
| * | Use connection.error_number in MySQLDatabaseTasksJohn Hawthorn2019-07-251-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | MySQLDatabaseTasks, like AbstractMysqlAdapter, should be able to operate on any mysql adapter, not just mysql2. Errors having a .error_number attribute is a mysql2 specific API, which we (Rails) don't control, so we should instead use connection.error_number(err), which we do. This also updates tests to better test how this really works, previously it stubbed create_database to raise Tasks::DatabaseAlreadyExists, which can never happen.
* | | Merge pull request #36380 from ↵Rafael Mendonça França2019-07-251-0/+9
|\ \ \ | |/ / |/| | | | | | | | | | | edudepetris/ed/36272-better-negative-scope-warning Add a warning for enum elements with 'not_' prefix.
| * | Add a warning for enum elements with 'not_' prefix.Edu Depetris2019-06-301-0/+9
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | When a enum element contains the prefix 'not_'. I warns to users to be aware of this new feature. Example code: class Foo < ActiveRecord::Base enum status: [:sent, :not_sent] end
* | | Merge pull request #36412 from robotdana/compact_blankRafael Mendonça França2019-07-255-12/+12
|\ \ \ | | | | | | | | | | | | Add compact_blank shortcut for reject(&:blank?)
| * | | Use compact_blank throughout railsDana Sherson2019-06-055-12/+12
| | | |
* | | | Make sure AR can load without Railseileencodes2019-07-251-0/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | In #36560 I accidentally re-introduced a bug where ActiveRecord can't be used without Rails. This returns an empty hash if we're outside the context of Rails since we can't create the database tasks without loading and reading the database yaml which is something only Railties can do.
* | | | Merge pull request #36740 from ↵Rafael França2019-07-251-1/+1
|\ \ \ \ | |_|_|/ |/| | | | | | | | | | | stanhu/sh-fix-index-exists-postgresql-partial-index Fix index_exists? for PostgreSQL expression indexes
| * | | Fix index_exists? for PostgreSQL expression indexesStan Hu2019-07-241-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Previously Rails expected indexes to be an array of columns, but for PostgreSQL a expression index can just be a string of text. Handle this by forcing `Index#columns` to be an Array inside `index_exists?`. Closes #36739
* | | | Merge pull request #36492 from kamipo/remove_depth_first_visitorRyuta Kamizono2019-07-253-212/+0
|\ \ \ \ | | | | | | | | | | Remove unused `DepthFirst` visitor
| * | | | Remove unused `DepthFirst` visitorRyuta Kamizono2019-06-153-212/+0
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | We only use `ToSQL` visitors in the our codebase, do not use `DepthFirst` and `Dot` visitors. The `DepthFirst` visitor (which was introduced at c86c37e5f) is used to traverse an Arel (partial) ast with depth first. Is there any worth to keep that undocumented feature with much code and test cases. This removes that unused `DepthFirst` code and test cases.
* | | | | Merge pull request #36756 from seejohnrun/env-urls-with-multiple-databasesEileen M. Uchitelle2019-07-241-12/+18
|\ \ \ \ \ | | | | | | | | | | | | Fix multiple database support for DATABASE_URL env variable
| * | | | | Fix multiple database support for DATABASE_URL env variableJohn Crepezzi2019-07-241-12/+18
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This commit fixes an issue where multi-database configurations were incompatible with setting a `DATABASE_URL` environment variable. As part of this work, this commit also includes a light refactor to make both multi and single database configurations lead into the same code path so they behave the same. As mentioned in #36736, this regression was introduced as part of f2ad69fe7a605b01bb7c37eeac6a9b4e7deb488e
* | | | | | Merge pull request #36580 from Shopify/schema-cache-deuplication-from-databaseRafael França2019-07-241-5/+15
|\ \ \ \ \ \ | | | | | | | | | | | | | | Also deduplicate schema cache structure when they are read from the database
| * | | | | | Also deduplicate schema cache structure when they are read from the databaseJean Boussier2019-07-011-5/+15
| | |_|_|_|/ | |/| | | |
* | | | | | Merge pull request #36671 from ↵Eileen M. Uchitelle2019-07-241-1/+1
|\ \ \ \ \ \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | wjessop/do_not_validate_non_dirty_association_targets Don't validate non dirty association targets
| * | | | | | Don't validate non dirty association targetsWill Jessop2019-07-151-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Fixes #36581. This fixes an issue where validations would return differently when a previously saved invalid association was loaded between calls: assert_equal true, squeak.valid? assert_equal true, squeak.mouse.present? assert_equal true, squeak.valid? Here the second assert would return Expected: true Actual: false Limiting validations to associations that would be normally saved (using autosave: true) due to changes means that loading invalid associated relations will not change the return value of the parent relations's `valid?` method.
* | | | | | | Merge pull request #36744 from freeletics/fix-db-prepareEileen M. Uchitelle2019-07-241-3/+4
|\ \ \ \ \ \ \ | |_|_|_|_|/ / |/| | | | | | Fixed db:prepare task to not touch schema when it is disabled
| * | | | | | Fixed db:prepare task to not touch schema when dump_schema_after_migration ↵Wojciech Wnętrzak2019-07-241-3/+4
| | |_|/ / / | |/| | | | | | | | | | | | | | | | is false.
* | | | | | Merge pull request #36665 from jmschneider/masterRafael Mendonça França2019-07-231-2/+2
|\ \ \ \ \ \ | |/ / / / / |/| | | | | | | | | | | Make currency symbols optional for money column type in PostgreSQL