##はじめに
初学者がポートフォリオ作成でハマったことをメモします。
魚の食味投稿サービスを作成中。
##環境
Ruby 2.6.3 ,Rails 5.2.4
##やりたいことと結果
・やりたいこと
子テーブルの集合から親テーブルのインスタンスを重複なく取得したい。
・結果
Fish.joins(:reviews).distinct
##前提
親テーブル fishes
子テーブル reviews
Fishインスタンスに複数のReviewインスタンスが紐づいている。
class Fish < ApplicationRecord
has_many :reviews
class Review < ApplicationRecord
belongs_to :fish
##やりたいこと(詳細)
投稿(review)を魚(fish)の種類で検索する為に、複数の投稿に含まれる魚の名前をselectの選択肢に表示したい。
その為に、Reviewインスタンスの集合に紐づいているFishインスタンスを重複なく取得したい。
つまり、reviewsレコードのfish_idがfishesレコードのidと一致する、fishesレコードを重複なく取得したい。
##コード
joinsメソッドを使ってreviewsテーブルとfishesテーブルを内部結合することが出来る。
Fish.joins(:reviews)
このままレコードを取得すると同じfish.idを持つレコードが重複してしまう、そこで
Fish.joins(:reviews).distinct
distinct
を使うと重複をのぞくことができる。
発行されるSQL
SELECT DISTINCT "fishes".* FROM "fishes" INNER JOIN "reviews" ON "reviews"."fish_id" = "fishes"."id"
検索部分のコード
= f.select :fish_id_eq, options_for_select(Fish.joins(:reviews).distinct.map{|fish| [fish.name , fish.id]}) ,{include_blank: "指定なし"},class: "js-selectable"