1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00
rails--rails/activerecord/test/models
eileencodes de6b4efa3e
Add option to skip joins for associations.
In a multiple database application, associations can't join across
databases. When set, this option tells Rails to make 2 or more queries
rather than using joins for associations.

Set the option on a has many through association:

```ruby
class Dog
  has_many :treats, through: :humans, disable_joins: true
  has_many :humans
end
```

Then instead of generating join SQL, two queries are used for `@dog.treats`:

```
SELECT "humans"."id" FROM "humans" WHERE "humans"."dog_id" = ?  [["dog_id", 1]]
SELECT "treats".* FROM "treats" WHERE "treats"."human_id" IN (?, ?, ?)  [["human_id", 1], ["human_id", 2], ["human_id", 3]]
```

This code is extracted from a gem we use internally at GitHub which
means the implementation here is used in production daily and isn't
experimental.

I often get the question "why can't Rails do this automatically" so I
figured I'd include the answer in the commit. Rails can't do this
automatically because associations are lazily loaded. `dog.treats` needs
to load `Dog`, then `Human` and then `Treats`. When `dog.treats` is
called Rails pre-generates the SQL that will be run and puts that
information into a reflection object. Because the SQL parts are pre-generated,
as soon as `dog.treats` is loaded it's too late to skip a join. The join
is already available on the object and that join is what's run to load
`treats` from `dog` through `humans`. I think the only way to avoid setting
an option on the association is to rewrite how and when the SQL is
generated for associations which is a large undertaking. Basically the
way that Active Record associations are designed, it is currently
impossible to have Rails figure out to not join (loading the association
will cause the join to occur, and that join will raise an error if the
models don't live in the same db).

The original implementation was written by me and Aaron. Lee helped port
over tests, and I refactored the extraction to better match Rails style.

Co-authored-by: Lee Quarella <leequarella@gmail.com>
Co-authored-by: Aaron Patterson <aaron@rubyonrails.org>
2021-04-19 11:17:31 -04:00
..
admin Update prefix and allow suffix options for store accessors 2018-06-12 07:10:09 -07:00
autoloadable Use frozen-string-literal in ActiveRecord 2017-07-19 22:27:07 +03:00
publisher Use frozen-string-literal in ActiveRecord 2017-07-19 22:27:07 +03:00
account.rb Ensure Contextual validations fire on associations 2019-10-04 12:17:53 +01:00
admin.rb Use frozen-string-literal in ActiveRecord 2017-07-19 22:27:07 +03:00
aircraft.rb Use frozen-string-literal in ActiveRecord 2017-07-19 22:27:07 +03:00
arunit2_model.rb Use frozen-string-literal in ActiveRecord 2017-07-19 22:27:07 +03:00
author.rb Add option to skip joins for associations. 2021-04-19 11:17:31 -04:00
author_encrypted.rb Add support for uniqueness validations 2021-04-01 15:02:15 +02:00
auto_id.rb Use frozen-string-literal in ActiveRecord 2017-07-19 22:27:07 +03:00
binary.rb Use frozen-string-literal in ActiveRecord 2017-07-19 22:27:07 +03:00
binary_field.rb Handle binary strings in Active Record serialized columns 2020-10-14 11:57:34 +02:00
bird.rb Revert "Merge pull request #35186 from kamipo/fix_leaking_scope_on_relation_create" 2019-02-15 12:06:45 +09:00
book.rb Extract encrypted models to their own files 2021-04-01 15:02:14 +02:00
book_destroy_async.rb Destroy associations in a background job. 2020-09-24 14:24:15 -04:00
book_encrypted.rb Add new "encrypted_books" table to the schema 2021-04-03 08:00:01 -04:00
boolean.rb Use frozen-string-literal in ActiveRecord 2017-07-19 22:27:07 +03:00
bulb.rb Implicit scoping does no longer leak scope to class level querying methods 2020-10-30 00:25:38 +00:00
cake_designer.rb Use frozen-string-literal in ActiveRecord 2017-07-19 22:27:07 +03:00
car.rb Fix unscoping association scope on joins not to raise an error 2020-04-16 00:34:41 +09:00
carrier.rb Use frozen-string-literal in ActiveRecord 2017-07-19 22:27:07 +03:00
cart.rb Don't over protect the MySQL users on insert_all 2020-11-04 20:26:22 +00:00
cat.rb Use frozen-string-literal in ActiveRecord 2017-07-19 22:27:07 +03:00
categorization.rb Use frozen-string-literal in ActiveRecord 2017-07-19 22:27:07 +03:00
category.rb Remove unused Category.has_and_belongs_to_many :popular_grouped_posts definition 2021-04-12 15:05:42 +09:00
chef.rb Use frozen-string-literal in ActiveRecord 2017-07-19 22:27:07 +03:00
citation.rb Fix has_many_inversing with touch: true on a belongs_to association with inverse 2021-01-07 22:15:24 +00:00
club.rb chore: fix spelling change favourite to the more used favorite 2021-04-12 12:35:12 +10:00
college.rb Removes require_dependency from the AR test suite 2020-05-06 09:01:38 +02:00
column.rb Use frozen-string-literal in ActiveRecord 2017-07-19 22:27:07 +03:00
column_name.rb Use frozen-string-literal in ActiveRecord 2017-07-19 22:27:07 +03:00
comment.rb Add option to skip joins for associations. 2021-04-19 11:17:31 -04:00
company.rb Avoid stack level too deep in predicate builder 2021-02-11 11:32:20 -05:00
company_in_module.rb Enable Layout/EmptyLinesAroundAccessModifier cop 2019-06-13 12:00:45 +09:00
computer.rb Use frozen-string-literal in ActiveRecord 2017-07-19 22:27:07 +03:00
contact.rb Deduplicate various Active Record schema cache structures 2019-06-03 13:31:42 +02:00
content.rb Use frozen-string-literal in ActiveRecord 2017-07-19 22:27:07 +03:00
contract.rb Fix complicated has_many through with nested where condition 2021-01-05 11:40:04 +09:00
country.rb create_table with :primary_key option has no effect if id: false is given 2018-10-27 22:57:16 +09:00
course.rb Removes require_dependency from the AR test suite 2020-05-06 09:01:38 +02:00
customer.rb Fix composed_of with symbol mapping 2020-12-15 20:06:23 +09:00
customer_carrier.rb Use frozen-string-literal in ActiveRecord 2017-07-19 22:27:07 +03:00
dashboard.rb Revert "Refactor uncastable through reflection test to detect join key overrides" 2020-09-25 17:49:52 -04:00
default.rb Use frozen-string-literal in ActiveRecord 2017-07-19 22:27:07 +03:00
department.rb Use frozen-string-literal in ActiveRecord 2017-07-19 22:27:07 +03:00
destroy_async_parent.rb Destroy associations in a background job. 2020-09-24 14:24:15 -04:00
destroy_async_parent_soft_delete.rb Destroy associations in a background job. 2020-09-24 14:24:15 -04:00
developer.rb Handle false in relation strict loading checks 2021-03-16 16:26:59 -04:00
discount.rb Reproduce the preloader regression in #41596 2021-03-15 12:36:21 -07:00
dl_keyed_belongs_to.rb Destroy associations in a background job. 2020-09-24 14:24:15 -04:00
dl_keyed_belongs_to_soft_delete.rb Destroy associations in a background job. 2020-09-24 14:24:15 -04:00
dl_keyed_has_many.rb Destroy associations in a background job. 2020-09-24 14:24:15 -04:00
dl_keyed_has_many_through.rb Destroy associations in a background job. 2020-09-24 14:24:15 -04:00
dl_keyed_has_one.rb Destroy associations in a background job. 2020-09-24 14:24:15 -04:00
dl_keyed_join.rb Destroy associations in a background job. 2020-09-24 14:24:15 -04:00
dog.rb Use frozen-string-literal in ActiveRecord 2017-07-19 22:27:07 +03:00
dog_lover.rb Use frozen-string-literal in ActiveRecord 2017-07-19 22:27:07 +03:00
doubloon.rb Use frozen-string-literal in ActiveRecord 2017-07-19 22:27:07 +03:00
drink_designer.rb Polymorphic has_one touch: Reset association cache result after create transaction 2019-07-31 05:59:23 +02:00
edge.rb Use frozen-string-literal in ActiveRecord 2017-07-19 22:27:07 +03:00
electron.rb Use frozen-string-literal in ActiveRecord 2017-07-19 22:27:07 +03:00
engine.rb Use frozen-string-literal in ActiveRecord 2017-07-19 22:27:07 +03:00
entrant.rb Use frozen-string-literal in ActiveRecord 2017-07-19 22:27:07 +03:00
entry.rb Add delegated type to Active Record (#39341) 2020-05-23 15:14:40 -07:00
essay.rb Use frozen-string-literal in ActiveRecord 2017-07-19 22:27:07 +03:00
essay_destroy_async.rb Handle STI models for has_many dependent: :destroy_async 2021-01-06 02:04:23 +01:00
event.rb Use frozen-string-literal in ActiveRecord 2017-07-19 22:27:07 +03:00
eye.rb Use frozen-string-literal in ActiveRecord 2017-07-19 22:27:07 +03:00
face.rb Set inverse during has one autosave if necessary 2020-10-30 15:31:40 +00:00
family.rb Use frozen-string-literal in ActiveRecord 2017-07-19 22:27:07 +03:00
family_tree.rb Use frozen-string-literal in ActiveRecord 2017-07-19 22:27:07 +03:00
friendship.rb Use frozen-string-literal in ActiveRecord 2017-07-19 22:27:07 +03:00
frog.rb Merge pull request #30956 from CJStadler/with-lock-changed-deprecation 2018-03-28 13:11:01 -04:00
guid.rb Use frozen-string-literal in ActiveRecord 2017-07-19 22:27:07 +03:00
guitar.rb Use frozen-string-literal in ActiveRecord 2017-07-19 22:27:07 +03:00
hotel.rb Use frozen-string-literal in ActiveRecord 2017-07-19 22:27:07 +03:00
human.rb Set inverse during has one autosave if necessary 2020-10-30 15:31:40 +00:00
image.rb :polymorphic, :as, and :foreign_type are valid for polymorphic association 2019-11-10 10:54:58 +09:00
interest.rb Replace test Man with Human 2020-08-14 11:37:09 -04:00
invoice.rb Reproduce the preloader regression in #41596 2021-03-15 12:36:21 -07:00
item.rb Use frozen-string-literal in ActiveRecord 2017-07-19 22:27:07 +03:00
job.rb Use frozen-string-literal in ActiveRecord 2017-07-19 22:27:07 +03:00
joke.rb Use frozen-string-literal in ActiveRecord 2017-07-19 22:27:07 +03:00
keyboard.rb Use frozen-string-literal in ActiveRecord 2017-07-19 22:27:07 +03:00
legacy_thing.rb Use frozen-string-literal in ActiveRecord 2017-07-19 22:27:07 +03:00
lesson.rb Use frozen-string-literal in ActiveRecord 2017-07-19 22:27:07 +03:00
line_item.rb Reproduce the preloader regression in #41596 2021-03-15 12:36:21 -07:00
liquid.rb Use frozen-string-literal in ActiveRecord 2017-07-19 22:27:07 +03:00
matey.rb Use frozen-string-literal in ActiveRecord 2017-07-19 22:27:07 +03:00
measurement.rb This PR adds support to retrieve partitioned indexes when asking for 2020-02-06 07:36:44 +02:00
member.rb Add option to skip joins for associations. 2021-04-19 11:17:31 -04:00
member_detail.rb Using existing models for building multiple has_one through tests 2018-04-22 04:16:44 +09:00
member_type.rb Use frozen-string-literal in ActiveRecord 2017-07-19 22:27:07 +03:00
membership.rb allow table name and direction in string order arg 2017-11-09 22:41:33 +10:30
mentor.rb Use frozen-string-literal in ActiveRecord 2017-07-19 22:27:07 +03:00
message.rb Add delegated type to Active Record (#39341) 2020-05-23 15:14:40 -07:00
minimalistic.rb Use frozen-string-literal in ActiveRecord 2017-07-19 22:27:07 +03:00
minivan.rb Use frozen-string-literal in ActiveRecord 2017-07-19 22:27:07 +03:00
mixed_case_monkey.rb Replace test Man with Human 2020-08-14 11:37:09 -04:00
molecule.rb Use frozen-string-literal in ActiveRecord 2017-07-19 22:27:07 +03:00
mouse.rb Don't validate non dirty association targets 2019-07-15 18:21:20 +01:00
movie.rb Use frozen-string-literal in ActiveRecord 2017-07-19 22:27:07 +03:00
node.rb Use frozen-string-literal in ActiveRecord 2017-07-19 22:27:07 +03:00
non_primary_key.rb Use frozen-string-literal in ActiveRecord 2017-07-19 22:27:07 +03:00
notification.rb Use frozen-string-literal in ActiveRecord 2017-07-19 22:27:07 +03:00
numeric_data.rb Fix read_attribute_before_type_cast to consider attribute aliases 2020-10-18 20:32:47 -03:00
order.rb Use frozen-string-literal in ActiveRecord 2017-07-19 22:27:07 +03:00
organization.rb Use frozen-string-literal in ActiveRecord 2017-07-19 22:27:07 +03:00
other_dog.rb Removes require_dependency from the AR test suite 2020-05-06 09:01:38 +02:00
owner.rb try using regexes 2017-11-09 22:42:15 +10:30
parrot.rb Don't like to add extra models/tables/fixtures, use existing those 2021-02-25 11:32:44 +09:00
person.rb chore: fix spelling change favourite to the more used favorite 2021-04-12 12:35:12 +10:00
personal_legacy_thing.rb Use frozen-string-literal in ActiveRecord 2017-07-19 22:27:07 +03:00
pet.rb Use frozen-string-literal in ActiveRecord 2017-07-19 22:27:07 +03:00
pet_treasure.rb Use frozen-string-literal in ActiveRecord 2017-07-19 22:27:07 +03:00
pirate.rb Ensure Contextual validations fire on associations 2019-10-04 12:17:53 +01:00
possession.rb Use frozen-string-literal in ActiveRecord 2017-07-19 22:27:07 +03:00
post.rb Add option to skip joins for associations. 2021-04-19 11:17:31 -04:00
post_encrypted.rb Extract encrypted models to their own files 2021-04-01 15:02:14 +02:00
price_estimate.rb Fix numericality validator not to be affected by custom getter 2018-08-13 23:28:46 +09:00
professor.rb Removes require_dependency from the AR test suite 2020-05-06 09:01:38 +02:00
project.rb try using regexes 2017-11-09 22:42:15 +10:30
publisher.rb Use frozen-string-literal in ActiveRecord 2017-07-19 22:27:07 +03:00
randomly_named_c1.rb Use frozen-string-literal in ActiveRecord 2017-07-19 22:27:07 +03:00
rating.rb Maintain extra joins for string or complex arel conditions 2019-10-04 13:29:18 +09:00
reader.rb Use frozen-string-literal in ActiveRecord 2017-07-19 22:27:07 +03:00
recipe.rb Use frozen-string-literal in ActiveRecord 2017-07-19 22:27:07 +03:00
record.rb Use frozen-string-literal in ActiveRecord 2017-07-19 22:27:07 +03:00
reference.rb chore: fix spelling change favourite to the more used favorite 2021-04-12 12:35:12 +10:00
reply.rb Allow attribute aliases for validates_uniqueness_of 2020-06-01 22:44:39 +09:00
room.rb Fixed odd behavior of inverse_of with multiple belongs_to to same class 2020-11-21 02:06:21 +09:00
section.rb Fix circular autosave: true 2018-07-23 14:53:27 -07:00
seminar.rb Fix circular autosave: true 2018-07-23 14:53:27 -07:00
session.rb Fix circular autosave: true 2018-07-23 14:53:27 -07:00
ship.rb Ensure Contextual validations fire on associations 2019-10-04 12:17:53 +01:00
ship_part.rb Use frozen-string-literal in ActiveRecord 2017-07-19 22:27:07 +03:00
shipping_line.rb Reproduce the preloader regression in #41596 2021-03-15 12:36:21 -07:00
shop.rb Use frozen-string-literal in ActiveRecord 2017-07-19 22:27:07 +03:00
shop_account.rb Use frozen-string-literal in ActiveRecord 2017-07-19 22:27:07 +03:00
speedometer.rb Use frozen-string-literal in ActiveRecord 2017-07-19 22:27:07 +03:00
sponsor.rb Make reflection.klass raise if polymorphic? not to be misused 2018-02-19 00:11:29 +09:00
squeak.rb Don't validate non dirty association targets 2019-07-15 18:21:20 +01:00
strict_zine.rb Ignore strict loading violations on instances loaded through fixtures 2020-12-10 15:23:14 -06:00
string_key_object.rb Use frozen-string-literal in ActiveRecord 2017-07-19 22:27:07 +03:00
student.rb Use frozen-string-literal in ActiveRecord 2017-07-19 22:27:07 +03:00
subscriber.rb Revert "Refactor uncastable through reflection test to detect join key overrides" 2020-09-25 17:49:52 -04:00
subscription.rb Revert "Refactor uncastable through reflection test to detect join key overrides" 2020-09-25 17:49:52 -04:00
tag.rb Fix newly added reflection order when redefining association 2018-01-04 22:55:16 +09:00
tagging.rb Don't update counter cache when through record was not destroyed 2018-01-14 20:46:19 +00:00
task.rb Use frozen-string-literal in ActiveRecord 2017-07-19 22:27:07 +03:00
topic.rb Implicit scoping does no longer leak scope to class level querying methods 2020-10-30 00:25:38 +00:00
toy.rb Fix has_many_inversing with touch: true on a belongs_to association with inverse 2021-01-07 22:15:24 +00:00
traffic_light.rb Extract encrypted models to their own files 2021-04-01 15:02:14 +02:00
traffic_light_encrypted.rb Extract encrypted models to their own files 2021-04-01 15:02:14 +02:00
treasure.rb Use frozen-string-literal in ActiveRecord 2017-07-19 22:27:07 +03:00
treaty.rb create_table with :primary_key option has no effect if id: false is given 2018-10-27 22:57:16 +09:00
tree.rb Use frozen-string-literal in ActiveRecord 2017-07-19 22:27:07 +03:00
tuning_peg.rb Use frozen-string-literal in ActiveRecord 2017-07-19 22:27:07 +03:00
tyre.rb Use frozen-string-literal in ActiveRecord 2017-07-19 22:27:07 +03:00
user.rb Fixed odd behavior of inverse_of with multiple belongs_to to same class 2020-11-21 02:06:21 +09:00
user_with_invalid_relation.rb compute_class raise when klass is not ActiveRecord::Base subclass 2020-12-14 14:49:14 +01:00
uuid_child.rb Use frozen-string-literal in ActiveRecord 2017-07-19 22:27:07 +03:00
uuid_comment.rb Allow delegated_type to be specified primary_key and foreign_key 2020-12-18 15:06:16 +09:00
uuid_entry.rb Allow delegated_type to be specified primary_key and foreign_key 2020-12-18 15:06:16 +09:00
uuid_item.rb Use frozen-string-literal in ActiveRecord 2017-07-19 22:27:07 +03:00
uuid_message.rb Allow delegated_type to be specified primary_key and foreign_key 2020-12-18 15:06:16 +09:00
uuid_parent.rb Use frozen-string-literal in ActiveRecord 2017-07-19 22:27:07 +03:00
vegetables.rb move ActiveRecord::Persistance#becomes logic into initialize block 2020-09-20 10:24:19 -06:00
vertex.rb Use frozen-string-literal in ActiveRecord 2017-07-19 22:27:07 +03:00
warehouse_thing.rb Use frozen-string-literal in ActiveRecord 2017-07-19 22:27:07 +03:00
wheel.rb Fix touch option to behave consistently with Persistence#touch method 2018-06-18 19:08:41 +09:00
without_table.rb Use frozen-string-literal in ActiveRecord 2017-07-19 22:27:07 +03:00
zine.rb Ignore strict loading violations on instances loaded through fixtures 2020-12-10 15:23:14 -06:00