aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib/active_record/associations
Commit message (Collapse)AuthorAgeFilesLines
* Remove single element array preprocessRyuta Kamizono2017-07-261-1/+1
| | | | | Since 213796f, array predicate handler supports making binds, so the preprocess is no longer needed.
* Remove useless `JoinInformation`Ryuta Kamizono2017-07-252-5/+3
| | | | | Since 213796f removed `binds`, `JoinInformation` only contain `joins`. So it is enough to return `joins` simply.
* Merge pull request #29765 from lugray/fix_counter_cacheRafael França2017-07-241-3/+1
|\ | | | | Fix `counter_cache` double increment
| * Add test for fixed `counter_cache` double incrementLisa Ugray2017-07-191-3/+1
| | | | | | | | | | | | | | | | | | | | | | When an `after_create` callback did `update_attributes` on a record with multiple `belongs_to` associations with counter caches, even numbered associations would have their counters double-incremented. Fixes to `ActiveModel::Dirty` in 020abad fixed this. This adds regression tests for this bug fixed incidentally in the other commit, which also removed the need for the workaround using @_after_create_counter_called.
* | Refactor Active Record to let Arel manage bind paramsSean Griffin2017-07-242-5/+3
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | A common source of bugs and code bloat within Active Record has been the need for us to maintain the list of bind values separately from the AST they're associated with. This makes any sort of AST manipulation incredibly difficult, as any time we want to potentially insert or remove an AST node, we need to traverse the entire tree to find where the associated bind parameters are. With this change, the bind parameters now live on the AST directly. Active Record does not need to know or care about them until the final AST traversal for SQL construction. Rather than returning just the SQL, the Arel collector will now return both the SQL and the bind parameters. At this point the connection adapter will have all the values that it had before. A bit of this code is janky and something I'd like to refactor later. In particular, I don't like how we're handling associations in the predicate builder, the special casing of `StatementCache::Substitute` in `QueryAttribute`, or generally how we're handling bind value replacement in the statement cache when prepared statements are disabled. This also mostly reverts #26378, as it moved all the code into a location that I wanted to delete. /cc @metaskills @yahonda, this change will affect the adapters Fixes #29766. Fixes #29804. Fixes #26541. Close #28539. Close #24769. Close #26468. Close #26202. There are probably other issues/PRs that can be closed because of this commit, but that's all I could find on the first few pages.
* | Merge pull request #29855 from lugray/has_one_destroyed_by_associationRafael França2017-07-211-0/+2
|\ \ | | | | | | Match destroyed_by_association for has_one to has_many
| * | Match destroyed_by_association for has_one to has_manyLisa Ugray2017-07-211-0/+2
| | | | | | | | | | | | | | | | | | | | | When a has_many association is destroyed by `dependent: destroy`, destroyed_by_association is set to the reflection, and this can be checked in callbacks. This matches that behaviour for has_one associations.
* | | Use frozen-string-literal in ActiveRecordKir Shatrov2017-07-1935-0/+70
|/ /
* | Merge pull request #29033 from kamipo/make_preload_query_to_prepared_statementsSean Griffin2017-07-181-1/+1
|\ \ | |/ |/| Make preload query to preparable
| * Make preload query to preparableRyuta Kamizono2017-07-071-1/+1
| | | | | | | | | | | | | | Currently preload query cannot be prepared statements even if `prepared_statements: true` due to array handler in predicate builder doesn't support making bind params. This makes preload query to preparable by don't passing array value if possible.
* | Fix unscoping `default_scope` for `Preloader`Ryuta Kamizono2017-07-191-1/+11
| |
* | Fix `JoinDependency` with using a custom tableRyuta Kamizono2017-07-182-6/+9
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Without this fix, `JoinDependency` doesn't use a custom table alias: ``` % ARCONN=sqlite3 be ruby -w -Itest test/cases/relations_test.rb -n test_using_a_custom_table_with_joins_affects_the_wheres Using sqlite3 Run options: -n test_using_a_custom_table_with_joins_affects_the_wheres --seed 14531 E Error:RelationTest#test_using_a_custom_table_with_joins_affects_the_wheres: ActiveRecord::StatementInvalid: SQLite3::SQLException: no such column: posts.author_id: SELECT "omg_posts".* FROM "posts" "omg_posts" INNER JOIN "authors" ON "authors"."id" = "posts"."author_id" WHERE "omg_posts"."title" = ? LIMIT ? ```
* | Don't cache `scope_for_create`Ryuta Kamizono2017-07-162-2/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | I investigated where `scope_for_create` is reused in tests with the following code: ```diff --- a/activerecord/lib/active_record/relation.rb +++ b/activerecord/lib/active_record/relation.rb @@ -590,6 +590,10 @@ def where_values_hash(relation_table_name = table_name) end def scope_for_create + if defined?(@scope_for_create) && @scope_for_create + puts caller + puts "defined" + end @scope_for_create ||= where_values_hash.merge!(create_with_value.stringify_keys) end ``` It was hit only `test_scope_for_create_is_cached`. This means that `scope_for_create` will not be reused in normal use cases. So we can remove caching `scope_for_create` to respect changing `where_clause` and `create_with_value`.
* | Fix `create_with` using both string and symbolRyuta Kamizono2017-07-163-9/+7
| | | | | | | | | | | | | | This is related with #27680. Since `where_values_hash` keys constructed by `where` are string, so we need `stringify_keys` to `create_with_value` before merging it.
* | Remove useless `aliased_table_name` in `JoinDependency`Ryuta Kamizono2017-07-154-18/+1
|/ | | | If `table.table_alias` is not nil, it is enough to use `table` simply.
* Fix eager loading association with scope including joinsRyuta Kamizono2017-07-041-4/+10
| | | | Fixes #28324.
* Fix preloading association with scope including joinsRyuta Kamizono2017-07-043-49/+25
|
* Remove unused `association_key` and `table` methods in `Preloader::Association`Ryuta Kamizono2017-07-041-10/+0
| | | | These are no longer used since b98668decb9712f26118de57623fd15d7d28646d.
* Merge branch 'master' into require_relative_2017Xavier Noria2017-07-022-4/+12
|\
| * Revert "Merge pull request #29540 from kirs/rubocop-frozen-string"Matthew Draper2017-07-0235-35/+0
| | | | | | | | | | This reverts commit 3420a14590c0e6915d8b6c242887f74adb4120f9, reversing changes made to afb66a5a598ce4ac74ad84b125a5abf046dcf5aa.
| * Merge pull request #29540 from kirs/rubocop-frozen-stringMatthew Draper2017-07-0235-0/+35
| |\ | | | | | | | | | Enforce frozen string in Rubocop
| | * Enforce frozen string in RubocopKir Shatrov2017-07-0135-0/+35
| | |
| * | Merge pull request #29506 from pat/frozen-string-literalsMatthew Draper2017-07-021-2/+1
| |\ \ | | | | | | | | | | | | Make ActiveSupport frozen-string-literal friendly.
| | * | Make ActiveRecord frozen string literal friendly.Pat Allan2017-06-201-2/+1
| | | |
| * | | Merge pull request #29631 from kamipo/should_be_clear_association_idsMatthew Draper2017-07-011-2/+11
| |\ \ \ | | | | | | | | | | Should be clear `@association_ids` when joined newly associated record
| | * | | Should be clear `@association_ids` when joined newly associated recordRyuta Kamizono2017-06-301-2/+11
| | | |/ | | |/| | | | | | | | | Fixes #29627.
* | / | [Active Record] require => require_relativeAkira Matsuda2017-07-013-3/+3
|/ / /
* / / Delete stale comment for `AR::Associations::Builder::CollectionAssociation`fatkodima2017-07-011-2/+0
|/ /
* | Merge pull request #29616 from kamipo/remove_unused_aliased_table_nameRafael França2017-06-291-8/+0
|\ \ | | | | | | Remove unused `aliased_table_name` in `Association`
| * | Remove unused `aliased_table_name` in `Association`Ryuta Kamizono2017-06-291-8/+0
| | | | | | | | | | | | | | | | | | | | | `aliased_table_name` in `Association` was added at a3502c4. `aliased_table_name` in `JoinDependency` (added at 55854c4) is used, but it looks like that added one in `Association` is never used from the beginning.
* | | Merge pull request #29129 from kamipo/prevent_extra_through_scopeRafael França2017-06-281-2/+4
|\ \ \ | |/ / |/| | Prevent extra `through_scope`
| * | Prevent extra `through_scope`Ryuta Kamizono2017-05-181-2/+4
| | | | | | | | | | | | We can reuse `through_scope` for `reset_association`.
* | | Merge pull request #29610 from ↵Rafael França2017-06-284-7/+7
|\ \ \ | | | | | | | | | | | | | | | | kamipo/dont_passing_klass_connection_to_association_scope Don't passing `klass.connection` to `AssociationScope`
| * | | Don't passing `klass.connection` to `AssociationScope`Ryuta Kamizono2017-06-294-7/+7
| | | | | | | | | | | | | | | | | | | | Passing `klass.connection` is redundant because `AssociationScope` is passed an association itself and an association has `klass`.
* | | | Merge pull request #29604 from ↵Rafael França2017-06-281-4/+1
|\ \ \ \ | |/ / / |/| | | | | | | | | | | kamipo/fix_ids_reader_to_respect_case_sensitive_pk Fix `ids_reader` to respect case sensitive primary key
| * | | Fix `ids_reader` to respect case sensitive primary keyRyuta Kamizono2017-06-281-4/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ```ruby car = Car.create!(name: "Tofaş") # Before car.bulb_ids # => SELECT "bulbs".ID FROM "bulbs" WHERE "bulbs"."name" = $1 AND "bulbs"."car_id" = $2 [["name", "defaulty"], ["car_id", 3]] # After car.bulb_ids # => SELECT "bulbs"."ID" FROM "bulbs" WHERE "bulbs"."name" = $1 AND "bulbs"."car_id" = $2 [["name", "defaulty"], ["car_id", 3]] ```
* | | | Merge pull request #29593 from kratob/masterEileen M. Uchitelle2017-06-281-0/+5
|\ \ \ \ | |/ / / |/| | | ActiveRecord: do not create "has many through" records that have been removed
| * | | ActiveRecord: do not create "has many through" records that have been removedTobias Kraze2017-06-281-0/+5
| | | | | | | | | | | | | | | | | | | | If a record was built on a HasManyThroughAssociation, then removed, and then the record was saved, the removed record would be created anyways.
* | | | Merge pull request #29589 from kamipo/refactor_join_scopeRafael França2017-06-271-47/+3
|\ \ \ \ | | | | | | | | | | Refactor join dependency to move building constraints to `join_scope` in `Reflection`
| * | | | Move building constraint to `join_scope` in `Reflection`Ryuta Kamizono2017-06-271-39/+3
| | | | |
| * | | | Move constructing polymorphic type to `join_scope` in `Reflection`Ryuta Kamizono2017-06-271-10/+2
| |/ / /
* / / / Skip instantiating `NullPreloader` if `assoc.klass` is nilRyuta Kamizono2017-06-271-11/+3
|/ / / | | | | | | | | | | | | Simply we can skip instantiating `NullPreloader` if `assoc.klass` is nil.
* | | Merge pull request #29557 from kamipo/extract_build_scope_and_predicate_builderRafael França2017-06-262-13/+4
|\ \ \ | | | | | | | | Extract `build_scope` and `predicate_builder` in `Reflection`
| * | | Move constructing join scope to `Reflection`Ryuta Kamizono2017-06-261-9/+1
| | | |
| * | | Extract `build_scope` and `predicate_builder` in `Reflection`Ryuta Kamizono2017-06-242-5/+4
| | | |
* | | | Merge pull request #29568 from kamipo/ensure_using_correct_alias_trackerRafael França2017-06-263-14/+18
|\ \ \ \ | | | | | | | | | | Ensure that using correct alias tracker
| * | | | The AliasTracker#aliased_table_for needs the type caster for the joined ↵Ray Zane2017-06-253-14/+18
| |/ / / | | | | | | | | | | | | association, not the join root
* | | | Merge pull request #29511 from jhawthorn/clear_offsets_cache_on_collection_proxyRafael França2017-06-261-0/+1
|\ \ \ \ | |/ / / |/| | | Rails 5.1.2.rc1 regression - Clear offset cache on CollectionProxy reset/reload
| * | | Move clearing of @offsets cache to reset_scopeJohn Hawthorn2017-06-211-2/+1
| | | |
| * | | Clear offset cache on CollectionProxy reset/reloadJohn Hawthorn2017-06-201-0/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The `@offsets` cache is used by FinderMethods to cache records found by find_nth. This cache is cleared in AR::Relation#reset, but not in CollectionProxy#reset or CollectionProxy#reload. Because of this, since #29098, calling #first/#find_nth/etc after calling #reload or #reset on an association could return a stale record. This is an issue both when the full association target is loaded and when the item is loaded in #find_nth. This commit solves the problem by clearing the `@offsets` cache in CollectionProxy#reset and CollectionProxy#reload.