File tree 2 files changed +36
-1
lines changed
2 files changed +36
-1
lines changed Original file line number Diff line number Diff line change @@ -10,7 +10,7 @@ smart people at [Hashrocket](http://hashrocket.com/).
10
10
For a steady stream of TILs from a variety of rocketeers, checkout
11
11
[ til.hashrocket.com] ( https://til.hashrocket.com/ ) .
12
12
13
- _ 818 TILs and counting..._
13
+ _ 819 TILs and counting..._
14
14
15
15
---
16
16
@@ -504,6 +504,7 @@ _818 TILs and counting..._
504
504
- [ Mark A Migration As Irreversible] ( rails/mark-a-migration-as-irreversible.md )
505
505
- [ Make ActionMailer Synchronous In Test] ( rails/make-action-mailer-synchronous-in-test.md )
506
506
- [ Mark For Destruction] ( rails/mark-for-destruction.md )
507
+ - [ Merge A Scope Into An ActiveRecord Query] ( rails/merge-a-scope-into-an-activerecord-query.md )
507
508
- [ Migrating Up Down Up] ( rails/migrating-up-down-up.md )
508
509
- [ Params Includes Submission Button Info] ( rails/params-includes-submission-button-info.md )
509
510
- [ Perform SQL Explain With ActiveRecord] ( rails/perform-sql-explain-with-activerecord.md )
Original file line number Diff line number Diff line change
1
+ # Merge A Scope Into An ActiveRecord Query
2
+
3
+ Consider an ActiveRecord model with a scope:
4
+
5
+ ``` ruby
6
+ class Book < ApplicationRecord
7
+ scope :published , -> { where(" books.published_at is not null" ) }
8
+ end
9
+ ```
10
+
11
+ Now let's say we are working in another part of the codebase composing a query
12
+ that gathers all authors with published books. That might look something like
13
+ this:
14
+
15
+ ``` ruby
16
+ published_authors =
17
+ Authors .joins(:book ).where(" books.published_at is not null" )
18
+ ```
19
+
20
+ This will get the job done, but we've now duplicated the same logic in
21
+ different parts of the app. We can utilize the existing scope on ` Book ` using
22
+ ActiveRecord's
23
+ [ ` merge ` ] ( https://devdocs.io/rails~5.2/activerecord/spawnmethods#method-i-merge )
24
+ method.
25
+
26
+ ``` ruby
27
+ published_authors =
28
+ Authors .joins(:book ).merge( Book .published )
29
+ ```
30
+
31
+ The ` merge ` method can be used to incorporate any conditions from other partial
32
+ queries -- this means both ` where ` clauses and ` joins ` clauses.
33
+
34
+ [ source] ( http://aokolish.me/blog/2015/05/26/how-to-simplify-active-record-scopes-that-reference-other-tables/ )
You can’t perform that action at this time.
0 commit comments