2
3

More than 3 years have passed since last update.

【Rails】子テーブルの集合から親テーブルのインスタンスを重複を除いて取得する方法

Posted at

はじめに

初学者がポートフォリオ作成でハマったことをメモします。
魚の食味投稿サービスを作成中。

環境

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"
2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3