これまでに作った機能について簡単にまとめていく。

今回は、

子モデルを持たないレコードの取得

前提条件

アソシエーションが設定されていること(今回はラベル機能を作成済み)
ラベル機能の詳細はこちら

使用モデル

Taskモデル

カラム データ型
1 name string
2 content text

Labelモデル

カラム データ型
1 name string

TaskLabelsモデル

カラム データ型
1 task_id bigint
2 label_id bigint

設定アソシエーション

app/models/task.rb

has_many :task_labels, dependent: :destroy
has_many :labels, through: :task_labels

app/models/task_label.rb

belongs_to :task
belongs_to :label

app/models/label.rb

has_many :task_labels, dependent: :destroy
has_many :tasks, through: :task_labels

子モデルを持たないレコードの取得

変更前

@tasks = Task.all

変更後

@tasks = Task.left_joins(:labels).select("tasks.*").where("labels.id is null")

概要

TaskモデルとLabelモデルをLEFT JOIN(左外部結合)し、
その後、labelのidを持たないTaskのレコードを全て取得している。

以上で作成完了