Railsの練習帳 Chapter 02 ActiveRecord ActiveRecordの知識
#rails #練習帳
https://zenn.dev/igaiga/books/rails-practice-note/viewer/preface
関連先を指定するjoinsメソッド、whereメソッドの書き方
code:ruby
User.joins(:books).where(books: {title: "Ruby"})
# SQL: SELECT "users".* FROM "users" INNER JOIN "books" ON "books"."user_id" = "users"."id" WHERE "books"."title" = ? "title", "Ruby"
code:ruby
User.joins(books: :novelties).where(novelties: {name: "postcard"})
# SQL: SELECT "users".* FROM "users" INNER JOIN "books" ON "books"."user_id" = "users"."id" INNER JOIN "novelties" ON "novelties"."book_id" = "books"."id" WHERE "novelties"."name" = ? "name", "postcard"
https://railsguides.jp/active_record_querying.html
mergeメソッド
AR::RelationオブジェクトにmergeメソッドをつかってAR::Relationを渡すと、AR::Relation同士を結合することができます。
こんなUserとBookの関連で考える
code:ruby
class User < ApplicationRecord
has_many :books
end
class Book < ApplicationRecord
belongs_to :user
scope :ruby ->{ where(title: "Ruby") }
end
mergeメソッドにはAR::Relationを渡せるので、scopeを渡すこともできます。これらのコードは同じSQLを発行します。
code:ruby
user.books.merge(Book.ruby)
user.books.merge(Book.where(title: "Ruby"))
user.books.ruby
user.books.where(title: "Ruby")
#=> SELECT "books".* FROM "books" WHERE "books"."user_id" = 1 AND "books"."title" = 'Ruby'
joinsをつかうときにテーブルを指定して条件を書きたいときがあります。User.joins(:books).where(title: "Ruby") と書くと、where条件の対象はBookモデルではなくUserモデルなので、WHERE users.title = 'Ruby' となります。
mergeを使うと対象テーブルを指定してARメソッド群をつなげることができる
code:ruby
User.joins(:books).merge(Book.where(title: "Ruby"))
#=> "SELECT "users".* FROM "users" INNER JOIN "books" ON "books"."user_id" = "users"."id" WHERE "books"."title" = 'Ruby'"