From 9bd857508f3243accecbb90f8473787df6e09e8b Mon Sep 17 00:00:00 2001 From: Daniel Rice Date: Sun, 23 Aug 2020 11:12:10 -0600 Subject: [PATCH 1/3] Add example showing how to use named scopes in join queries. --- guides/source/active_record_querying.md | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/guides/source/active_record_querying.md b/guides/source/active_record_querying.md index c8827be498c2d..44f84e8a0fdc2 100644 --- a/guides/source/active_record_querying.md +++ b/guides/source/active_record_querying.md @@ -1243,7 +1243,7 @@ You can specify conditions on the joined tables using the regular [Array](#array ```ruby time_range = (Time.now.midnight - 1.day)..Time.now.midnight -Customer.joins(:orders).where('orders.created_at' => time_range) +Customer.joins(:orders).where('orders.created_at' => time_range).distinct ``` This will find all customers who have orders that were created yesterday, using a `BETWEEN` SQL expression to compare `created_at`. @@ -1252,7 +1252,26 @@ An alternative and cleaner syntax is to nest the hash conditions: ```ruby time_range = (Time.now.midnight - 1.day)..Time.now.midnight -Customer.joins(:orders).where(orders: { created_at: time_range }) +Customer.joins(:orders).where(orders: { created_at: time_range }).distinct +``` + +For more advanced conditions or to reuse an existing named scope, `Relation#merge` may be used. First, let's add a new named scope to the Order model: + +```ruby +class Order < ApplicationRecord + belongs_to :customer + + scope :created_in_time_range, ->(time_range) { + where(created_at: time_range) + } +end +``` + +Now we can use `Relation#merge`: + +```ruby +time_range = (Time.now.midnight - 1.day)..Time.now.midnight +Customer.joins(:orders).merge(Order.created_in_time_range(time_range)).distinct ``` This will find all customers who have orders that were created yesterday, again using a `BETWEEN` SQL expression. From a5770720b878d3fde868bb97b4313da84a8034ed Mon Sep 17 00:00:00 2001 From: Daniel Rice Date: Mon, 7 Sep 2020 22:08:11 -0600 Subject: [PATCH 2/3] Update guides/source/active_record_querying.md Co-authored-by: Petrik de Heus --- guides/source/active_record_querying.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guides/source/active_record_querying.md b/guides/source/active_record_querying.md index 44f84e8a0fdc2..e0e1de15e4809 100644 --- a/guides/source/active_record_querying.md +++ b/guides/source/active_record_querying.md @@ -1267,7 +1267,7 @@ class Order < ApplicationRecord end ``` -Now we can use `Relation#merge`: +Now we can use `Relation#merge` to merge in the `created_in_time_range` scope: ```ruby time_range = (Time.now.midnight - 1.day)..Time.now.midnight From df0f7c83944b28828ee7881d82ce824c5e029483 Mon Sep 17 00:00:00 2001 From: Daniel Rice Date: Mon, 7 Sep 2020 22:08:20 -0600 Subject: [PATCH 3/3] Update guides/source/active_record_querying.md Co-authored-by: Petrik de Heus --- guides/source/active_record_querying.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guides/source/active_record_querying.md b/guides/source/active_record_querying.md index e0e1de15e4809..3dbcff45e65a9 100644 --- a/guides/source/active_record_querying.md +++ b/guides/source/active_record_querying.md @@ -1255,7 +1255,7 @@ time_range = (Time.now.midnight - 1.day)..Time.now.midnight Customer.joins(:orders).where(orders: { created_at: time_range }).distinct ``` -For more advanced conditions or to reuse an existing named scope, `Relation#merge` may be used. First, let's add a new named scope to the Order model: +For more advanced conditions or to reuse an existing named scope, `Relation#merge` may be used. First, let's add a new named scope to the Order model: ```ruby class Order < ApplicationRecord