[tips]Railsでdefault_scopeを解除する方法

default_scopeって何?

って方は、まずはリファレンスをどうぞ。

Planモデルのstateは状態を表し
0: 終了済み  1: 未終了
とする。
そもそも終了済みのプランを参照したいこともあるはずなので、default_scopeをここで使うべきでない、という話もあると思いますが、今回は設定したdefault_scopeを解除する方法なのでそれはそれでどこかで。
Planモデルのdefault_scopeを解除する方法を紹介する。

方法1 unscopedを使って解除

unscopedを使うと、default_scopeだけでなく、全てのクエリが解除することができる。

この場合、where(state: 1)だけでなく、where(id: [1,2,3])も解除されるので、結果的にPlan.allと同じ挙動になる。
default_scopeの設定を解除することができるが、それまでのクエリも解除されてしまうので、

のように、Plan.unscopedしてからその後につらつら書いていくのが良さそうか。

ただし、例えば論理削除用のgemとか使っているとかで、deleted_atが入っているレコードを除くみたいな、解除されてほしくないクエリまでも、解除されてしまうので、where(deleted_at: nil)みたいなやつを改めて後ろに書かないといけない。ちょっと融通の効かない感じ。

方法2 unscopeを使って解除

unscopeはunscopedと違って、クエリを部分的に解除できる。
例えば以下のようにした場合

where(id: [1,2,3])はそのまま、default_scopeで指定しているstateに対する抽出条件のみ、解除することが可能。

スポンサーリンク
スポンサーリンク
スポンサーリンク

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

スポンサーリンク
スポンサーリンク