ActiveRecordのmergeについて
クエリの結合ができるメソッド
クエリの結合
code: (rb)
# mergeを使わない
Book.where(title: 'タイトル', author: 'Alice')
# mergeでクエリ結合
title_query = Book.where(title: 'タイトル')
author_query = Book.where(author: 'Alice')
title_query.merge(author_query)
# 1行でクエリ結合
Book.where(title: 'タイトル').merge(Book.where(author: 'Alice'))
code: (sql)
SELECT books.* FROM books WHERE title = 'タイトル' AND author = 'Alice';
スコープの結合
joins で結合 -> 結合先のモデルのスコープでの結果をmerge する
code: (rb)
class User < ApplicationRecord
has_many :books
end
class Book < ApplicationRecord
belongs_to :user
scope :published, -> { where(is_published: true) }
end
published スコープで絞り込んだbooksを持つuserの取得
code: (rb)
published_books = Book.published
User.joins(:books).merge(published_books)
# 1行
User.joins(:books).merge(Book.published)
code: (sql)
SELECT
users.*
FROM
users
INNER JOIN
books
ON
books.user_id = users.id
WHERE
books.is_published = TRUE
;
参照
https://api.rubyonrails.org/classes/ActiveRecord/SpawnMethods.html#method-i-merge
https://zenn.dev/ebina_shohei/articles/04b83f3d7a0402