| Commit message (Collapse) | Author | Age | Files | Lines |
| |
|
|
|
|
|
|
|
| |
This is an alternative of #29722, and follow up of #32048.
This does not change the current behavior, but makes it easier to modify
all polymorphic names consistently.
|
|
|
|
|
|
|
|
|
|
|
| |
Actually `reflection.klass` should be valid AR model unless
`polymorphic?`. Previously it worked limitedly by ignoring `NameError`
even if `reflection.klass` is invalid, and our isolated testing depends
on the limited working.
Probably we should also check the klass validity in `check_validity!`
properly. Until that time, I restored the error suppression for now.
Closes #32113.
|
|\
| |
| |
| |
| | |
kamipo/do_not_attempt_to_find_inverse_of_polymorphic
Make `reflection.klass` raise if `polymorphic?` not to be misused
|
| |
| |
| |
| |
| |
| |
| |
| |
| | |
`belongs_to` association
We can't automatically find the inverse of a polymorphic `belongs_to`
association without context.
[Ryuta Kamizono & Eric K Idema]
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
This is an alternative of #31877 to fix #31876 caused by #28808.
This issue was caused by a combination of several loose implementation.
* finding automatic inverse association of polymorphic without context (caused by #28808)
* returning `klass` even if `polymorphic?` (exists before #28808)
* loose verification by `valid_inverse_reflection?` (exists before #28808)
This makes `klass` raise if `polymorphic?` not to be misused.
This issue will not happen unless polymorphic `klass` is misused.
Fixes #31876.
Closes #31877.
|
|/
|
|
|
|
|
|
|
|
|
| |
This is an alternative of #29722, and revert of #29601 and a1fcbd9.
Currently, association creation and normal association finding doesn't
respect `store_full_sti_class`. But eager loading and preloading respect
the setting. This means that if set `store_full_sti_class = false`
(`true` by default), eager loading and preloading can not find
created polymorphic records.
Association creation and finding should work consistently.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
Most of the time the table and predicate_builder
passed to Relation.new are exactly the
arel_table and predicate builder of the
given klass. This uses klass.arel_table
and klass.predicate_builder as the defaults,
so we don't have to pass them in most cases.
This does change the signaure of both Relation and
AssocationRelation. Are we ok with that?
|
|
|
|
|
|
| |
`INVALID_AUTOMATIC_INVERSE_OPTIONS`
This option was moved into active_record_deprecated_finders in ac4d101.
|
|
|
|
| |
Need reloading when through record has replaced.
|
|\
| |
| |
| |
| |
| | |
zoltankiss/allow-nested-has-many-associations-on-unpersisted-parent-instances
fix nested `has many :through` associations on unpersisted parent instances
|
| |
| |
| |
| | |
Fixes: #16313
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
Currently reflections keeps the order when first added even if when
redefining association. As a result of the order, redefining through
association which use newly added association will raise
`HasManyThroughOrderError`. We need to redefine reflection order as well
when redefining association.
Fixes #31068.
|
| |
| |
| |
| |
| |
| |
| |
| | |
`ThroughReflection`
This method was introduced in #26718, which is internally used only in
`CollectionAssociation`. There is no need to be in the reflection
classes.
|
| |
| |
| |
| |
| |
| |
| | |
`association_primary_key` in `TableMetadata`
Because `join_primary_key` is called by `join_keys` and it is to
abstract calling `association_primary_key`.
|
| |
| |
| |
| |
| |
| |
| |
| |
| | |
`join_scopes` in `PolymorphicReflection` is passed aliased `table`, so
it should be respected for `source_type_scope`.
Closes #13969.
Fixes #13920.
Fixes #15190.
|
| | |
|
| | |
|
| | |
|
| | |
|
| |
| |
| |
| |
| | |
Because the reflection doesn't have `foreign_type` unless the
association is a polymorphic association.
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
Benchmark Script
```
require 'active_record'
require 'benchmark/ips'
require 'ruby-prof'
require 'memory_profiler'
require 'byebug'
ActiveRecord::Base.establish_connection(ENV.fetch('DATABASE_URL'))
ActiveRecord::Migration.verbose = false
ActiveRecord::Schema.define do
create_table :users, force: true do |t|
t.string :name, :email
t.integer :topic_id
t.timestamps null: false
end
create_table :topics, force: true do |t|
t.string :title
t.timestamps null: false
end
end
attributes = {
name: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.',
email: 'foobar@email.com'
}
class Topic < ActiveRecord::Base
has_many :users
end
class User < ActiveRecord::Base
belongs_to :topic
end
100.times do
User.create!(attributes)
end
users = User.first(50)
Topic.create!(title: 'This is a topic', users: users)
Benchmark.ips do |x|
x.config(time: 10, warmup: 5)
x.report("preload") do
User.includes(:topic).all.to_a
end
end
```
Before
```
Calculating -------------------------------------
preload 26.000 i/100ms
-------------------------------------------------
preload 265.347 (± 3.0%) i/s - 2.652k
```
After
```
Calculating -------------------------------------
preload 39.000 i/100ms
-------------------------------------------------
preload 406.053 (± 1.7%) i/s - 4.095k
```
|
| |
| |
| |
| | |
`reflection.join_primary_key`
|
| |
| |
| |
| |
| | |
The superclass (`MacroReflection`) already have the same method
definition.
|
| |
| |
| |
| |
| | |
`primary_key_type` is no longer used since #26718.
`quoted_table_name` is no longer used since Rails 3.1.
|
| |
| |
| |
| |
| |
| | |
Because `table` is part of `reflection`, don't need to pass it
explicitly. And also, naming `alias_name` to `table` is a little
confusing. `aliased_table` is preferable than `alias_name`.
|
| |
| |
| |
| |
| |
| | |
`PolymorphicReflection` is an internal class that is used in
`ThroughReflection`. But `RuntimeReflection` is used for the head of
chain in `AssociationScope`. These are totally different things.
|
| |
| |
| |
| |
| |
| |
| |
| |
| | |
The order of scope evaluation should be from through scope to the
association's own scope. Otherwise the association's scope cannot affect
to through scope.
Fixes #13677.
Closes #28449.
|
| |
| |
| |
| |
| |
| |
| |
| | |
Defined scope treats nil as `all`, but scope in associations isn't so.
If the result of the scope is nil, most features on associations will be
broken. It should treat nil as `all` like defined scope.
Fixes #20823.
|
| |
| |
| |
| |
| |
| |
| | |
always true
Because `add_as_polymorphic_through` is only called when
`options[:source_type]` is true.
|
| |
| |
| |
| | |
`RuntimeReflection#alias_candidate` is no longer used since 0408e212.
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
ActiveRecord associations automatically guess the inverse associations.
But this feature does not work correctly on assoctions for STI.
For example, before this commit
```
class Post < ActiveRecord::Base
belongs_to :author
end
class SpecialPost < Post; end
class Author < ActiveRecord::Base
has_many :posts
has_many :special_posts
end
```
`author.posts.first.author` works correctly, but
`author.special_posts.first.author` does not work correctly.
|
| |
| |
| |
| |
| |
| | |
Follow up of #29834.
Fixes #30266.
|
|\ \
| | |
| | | |
Extract `primary_key` to `AbstractReflection`
|
| | | |
|
|\ \ \
| | | |
| | | | |
Fix `reflection.association_primary_key` for `has_many` association
|
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | | |
It is incorrect to treat `options[:primary_key]` as
`association_primary_key` if `has_many` associations because the
`:primary_key` means the column on the owner record, not on the
association record. It will break `ids_reader` and `ids_writer`.
```ruby
people(:david).essay_ids
# => ActiveRecord::StatementInvalid: Mysql2::Error: Unknown column 'essays.first_name' in 'field list': SELECT `essays`.first_name FROM `essays` WHERE `essays`.`writer_id` = 'David'
```
Fixes #14439.
|
|\ \ \ \
| | | | |
| | | | | |
Remove unused `source_type_info` in `RuntimeReflection`
|
| |/ / /
| | | |
| | | |
| | | |
| | | | |
`source_type_info` is only used for `constraints` in
`PolymorphicReflection`.
|
|/ / /
| | |
| | |
| | | |
The primary key on the owner record is abstracted as `join_foreign_key`.
|
|/ /
| |
| |
| | |
It can use `AbstractReflection#table_name` simply.
|
| | |
|
| |
| |
| |
| |
| | |
Statement caches are used as a concurrent map. It will more clarify to
using `Concurrent::Map`.
|
| |
| |
| |
| |
| |
| | |
Actually `StatementCache#execute` is always passed the same klass that
the owner klass of the connection when the statement cache is created.
So passing `klass` to `StatementCache.new` will make more DRY.
|
| | |
|
| |
| |
| |
| |
| |
| |
| | |
Since 5c71000, it has lost to be able to unscope `default_scope` in STI
associations. This change will use `.empty_scope?` instead of
`.values.empty?` to regard as an empty scope if only have
`type_condition`.
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
This change was introduced by #18109. The intent of that change was to
specifically apply `unscoped`, not to allow all changes to
`current_scope` to affect the join. The idea of allowing `current_scope`
to affect joins is interesting and potentially more consistent, but has
sever problems associated with it. The fact that we're specifically
stripping out joins indicates one such problem (and potentially leads to
invalid queries).
Ultimately it's difficult to reason about what `Posts.joins(:users)`
actually means if it's affected by `User.current_scope`, and it's
difficult to specifically control what does or doesn't get added. If we
were starting from scratch, I don't think I'd have `joins` be affected
by `default_scope` either, but that's too big of a breaking change to
make at this point.
With this change, we no longer apply `current_scope` when bringing in
joins, with the singular exception of the motivating use case which
introduced this bug, which is providing a way to *opt-out* of having the
default scope apply to joins.
Fixes #29338.
|
| |
| |
| |
| | |
Fixes #28324.
|
| |
| |
| |
| |
| | |
This reverts commit 3420a14590c0e6915d8b6c242887f74adb4120f9, reversing
changes made to afb66a5a598ce4ac74ad84b125a5abf046dcf5aa.
|