0
Help us understand the problem. What are the problem?

posted at

updated at

【Rails】ControllerのParamの有無でWhere条件をつけたりつけなかったりする方法

これは「「はじめに」の Advent Calendar 2021」9日目の記事です。

1. モデルにScopeを追加

scopeの filter_name_byname を渡せるようにし、 name が存在するときに条件がセットされるようにします。

class Foo < ApplicationRecord
  has_many :barz
end

class Bar < ApplicationRecord
  belongs_to :foo

  scope :filter_name_by, -> (name) { where(name: name) if name.present? }
end

2. ControllerのParamをそのまま渡す

controllerではparamsをそのまま渡せます。

class BarController < ApplicationController
  def index
    bars = Bar.filter_name_by(params[:name])
    render json: bars
  end
end

nameがあるときのSQLは

SELECT * FROM bars WHERE bars.name = ?

nameがないときのSQLは

SELECT * FROM bars

3. Fooと子テーブルとしてBarを検索したい場合にBarに条件を追加する場合

include, referencesと一緒にmergeを使うそうです。

class FooController < ApplicationController
  def index
    foos = Foo.includes(:bars).merge(Bar.filter_name_by(params[:name])).references(:bars)
    render json: foos
  end
end
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
0
Help us understand the problem. What are the problem?