1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

ransackable_scopeに自由を!

Last updated at Posted at 2020-05-07

Railsで検索画面作るなら、Ransack ですよね。
めっちゃ便利。
あなたなしには生きていけない:relaxed:
もうあなたなしに、地道にcontrollerとmodelいじってた頃のことなんて、思い出せない...

検索機能を追加したい。
特に込み入った条件の… というとき、皆さんどうされます?

私は、ransackable_scopeを使います。

  1. ActiveRecord で scope 作り
  2. それをransackからの使用を許可します #ransackable_scopes

詳細は、↓に譲ります(ry
Ransack で ActiveRecord の Scope を利用して検索を行う方法
公式

この2番、面倒くさくないですか?

ransackでは、どのassociation, scope, model, 検索方式を使えるかを
権限制御として操作可能になってます。
このscope部分だけが、defaultで [] つまり、全拒否。

めんどい…。(エンジニア的美徳と信じて。)

正直、これが問題になること滅多にないので、
↓のmonkey patchでオーバーライド(ransackable_scopeを全無視)させました :japanese_ogre:

/config/initializers/ransack.rb

# 全scopeを使OK
module Ransack
  class Context
    def ransackable_scope?(str, klass)
      klass.respond_to? str
    end
  end
end

引数 0-1個のscopeは全部検索に使用可能です。
option引数を第二引数以降にいれても大丈夫ですしね。

また、パラメーターを配列にすれば、2引数以上でもOK(展開してくれる)

?q[my_scope][]=arg1&q[my_scope][]=arg2&q[my_scope][]=arg3

というわけで、自由勝ち取りました

まぁ、セキュリティあまり気にしない社内システムとか限定1で、
個人の責任でご使用くださいまし。

  1. 厳密には、ホワイトリスト型からブラックリスト型にするのがいいんだろな。#ransackable_limited_scope とか作って。

1
1
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
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?