ページ内ナビ
概要
Ransackは、RailsのActiveRecordへobject-basedな検索・絞り込み・ソートを追加するRuby gemです。controllerでsearch objectを作り、viewではsearch_form_forやsort_linkを使って、columnやassociationを条件にした検索UIを構築できます。Elasticsearch等の別serviceを用意せず、既存database queryとして実行できます。
特徴と向いている用途
公式資料に基づく紹介・実機未検証 · 内容確認日:
主な特徴
ActiveRecordのcolumnとassociationを検索条件にする
simple modeではattribute名とpredicateを組み合わせたquery parameterからActiveRecord relationを生成し、associationをまたいだ検索や複数attributeのOR条件にも対応します。
search_form_forとsort_linkで検索・並び替えUIを作る
専用form helperで検索fieldを作成し、sort_linkでtable headingなどにsort URLを生成できます。Turbo対応form helperも用意されています。
出典:[4]
複雑なpredicateやcustom ransackerへ拡張する
標準predicateに加え、advanced mode、custom predicate、ransacker、i18nなどを使い、SQLで表現できる検索ロジックをRails側へ組み込めます。
出典:[1]
向いている用途
既存databaseで完結する管理画面・一覧検索に向く
大規模full-text search engineを追加するほどではない、back-office一覧、顧客検索、絞り込み付きcatalogなどをRails内で実装したい場合に適しています。
出典:[1]
導入前の確認
v5.0.2未満のcrafted search keyによるDoSを残さない
v5.0.2は非常に長いq condition keyやsort valueをquadratic timeで解析するDoSを修正したsecurity releaseです。この問題はattribute allowlistだけでは緩和されないため、該当versionを利用している場合はupgradeします。
出典:[2]
検索・sort可能なcolumnとassociationを明示的に許可する
v4.0以降はmodelのcolumnが既定で検索・sort許可されません。ransackable_attributesやransackable_associations等、または対応するStrong Parameters設計で外部入力から到達可能なfieldを限定します。
参考にした公式資料
- [1]Ransack v5.0.2 README(2026-10-03)
- [2]Ransack v5.0.2 security release(2026-10-03)
- [3]Ransack v5.0.2 gemspec(2026-10-03)
- [4]Ransack simple mode documentation(2026-10-03)
- [6]Ransack MIT license(2026-10-03)
編集部からの補足
Elasticsearch等を別途運用するほどではない検索画面を、RailsのmodelとSQLの範囲で組み立てたい場合に有効です。ただし検索可能な属性・associationを明示的に制限し、v5.0.2より前のcrafted query keyによるDoS問題を残さないことが重要です。
3ステップで試す
- 1
security fix済みRansackを追加
v5.0.2はcrafted search keyによるDoSを修正したsecurity releaseです。Rails 7.2+とRuby 3.1+を確認します。
Add gem 'ransack', '5.0.2' to Gemfile, then run bundle install - 2
検索可能なattributeをmodelで許可
v4以降はcolumnが既定で検索許可されません。必要なfieldだけを明示的にallowlistします。
Define self.ransackable_attributes in the target ActiveRecord model - 3
controllerとviewへ検索を追加
controllerでsearch objectを作り、viewではsearch_form_for @qを使って検索fieldを配置します。
@q = Person.ransack(params[:q]); @people = @q.result(distinct: true)
成長
成長の推移 · 直近30日
5,858 Stars
推移データを蓄積中です。
開発アクティビティ
直近90日・週次
- Commit(直近30日)
- 55
- Open PR
- 1
開発アクティビティを蓄積中です。
Built with
カテゴリとタグ
カテゴリ
GitHubデータ
関連情報
関連記事を投稿するこのOSSの使い方や活用事例をMarkdownで投稿できます。管理者が承認した後に公開されます。
あわせて探訪
- Draper5,277 Stars
共通タグ 2件 · 同じ言語
Rails modelをdecorator/view-modelでwrapし、presentation logicをmodelやglobal helperから分離するRuby library
Ruby - Jekyll51,707 Stars
共通タグ 1件 · 共通カテゴリ 1件 · 同じ言語
MarkdownとLiquidからブログ対応の静的サイトを生成
Ruby - Homebrew49,876 Stars
共通タグ 1件 · 共通カテゴリ 1件 · 同じ言語
macOS/Linuxのソフトウェア導入を
Rubybrewコマンドへまとめるパッケージ管理ツール - Vagrant27,211 Stars
共通タグ 1件 · 共通カテゴリ 1件 · 同じ言語
Vagrantfileでprovider差を隠し、portableな開発環境を配布するsource-available tool
Ruby - Kamal14,627 Stars
共通タグ 1件 · 共通カテゴリ 1件 · 同じ言語
Docker化したWeb appをSSHでbare metalやcloud VMへ配備し、kamal-proxyでzero-downtime切替を行う
Ruby - ActiveAdmin9,713 Stars
共通タグ 1件 · 共通カテゴリ 1件 · 同じ言語
Rails applicationへ管理画面用Engineを組み込み、resourceと操作をDSLで定義する
Ruby
情報の誤りを報告
掲載内容に誤りや古い情報があればお知らせください。