mirror of
https://github.com/jbranchaud/til
synced 2026-01-03 15:18:01 +00:00
35 lines
1.0 KiB
Markdown
35 lines
1.0 KiB
Markdown
# Merge A Scope Into An ActiveRecord Query
|
|
|
|
Consider an ActiveRecord model with a scope:
|
|
|
|
```ruby
|
|
class Book < ApplicationRecord
|
|
scope :published, -> { where("books.published_at is not null") }
|
|
end
|
|
```
|
|
|
|
Now let's say we are working in another part of the codebase composing a query
|
|
that gathers all authors with published books. That might look something like
|
|
this:
|
|
|
|
```ruby
|
|
published_authors =
|
|
Authors.joins(:book).where("books.published_at is not null")
|
|
```
|
|
|
|
This will get the job done, but we've now duplicated the same logic in
|
|
different parts of the app. We can utilize the existing scope on `Book` using
|
|
ActiveRecord's
|
|
[`merge`](https://devdocs.io/rails~5.2/activerecord/spawnmethods#method-i-merge)
|
|
method.
|
|
|
|
```ruby
|
|
published_authors =
|
|
Authors.joins(:book).merge( Book.published )
|
|
```
|
|
|
|
The `merge` method can be used to incorporate any conditions from other partial
|
|
queries -- this means both `where` clauses and `joins` clauses.
|
|
|
|
[source](http://aokolish.me/blog/2015/05/26/how-to-simplify-active-record-scopes-that-reference-other-tables/)
|