これまでに作った機能について簡単にまとめていく。
今回は、
子モデルを持たないレコードの取得
前提条件
アソシエーションが設定されていること(今回はラベル機能を作成済み)
ラベル機能の詳細はこちら
使用モデル
Taskモデル
カラム | データ型 | |
---|---|---|
1 | name | string |
2 | content | text |
Labelモデル
カラム | データ型 | |
---|---|---|
1 | name | string |
TaskLabelsモデル
カラム | データ型 | |
---|---|---|
1 | task_id | bigint |
2 | label_id | bigint |
設定アソシエーション
app/models/task.rb
1 2 |
has_many :task_labels, dependent: :destroy has_many :labels, through: :task_labels |
app/models/task_label.rb
1 2 |
belongs_to :task belongs_to :label |
app/models/label.rb
1 2 |
has_many :task_labels, dependent: :destroy has_many :tasks, through: :task_labels |
子モデルを持たないレコードの取得
変更前
1 |
@tasks = Task.all |
変更後
1 |
@tasks = Task.left_joins(:labels).select("tasks.*").where("labels.id is null") |
概要
TaskモデルとLabelモデルをLEFT JOIN(左外部結合)し、
その後、labelのidを持たないTaskのレコードを全て取得している。
以上で作成完了