ransackable_scopeに自由を!


Railsで検索画面作るなら、Ransack ですよね。
めっちゃ便利。
あなたなしには生きていけない
もうあなたなしに、地道に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を全無視)させました

/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 とか作って。