酒と泪とRubyとRailsと

Ruby on Rails と Objective-C は酒の肴です!

Railsで複雑な検索条件を簡単に実装できるGem Ransack

Railsで検索機能を提供する場合に、複雑な条件の組み合わせを実装する時に便利なGem、『Ransack』を紹介たいと思います!


Gemのインストール

Gemfileに以下を追加して、コンソールでbundleを実行してください。

1
2
# 複雑な検索条件のサポート
gem "ransack"

検索条件について

LIKE条件(〜を含む): cont

hogeを含む(cont)名前を検索する場合の検索条件はこちら。

1
2
@products = Product.search(:name_cont => "hoge").result
#=> SELECT `products`.* FROM `products` WHERE (`products`.`name` LIKE '%hoge%')

イコール(=): eq

hogeと一致する名前を検索する場合の検索条件はこちら。

1
2
@products = Product.search(:name_eq => "hoge").result
#=> SELECT `products`.* FROM `products` WHERE (`products`.`name` = 'hoge')

より少ない lt

1000より少ない数を検索する場合の検索条件はこちら

1
2
@products = Product.search(:price_lt => 1000).result
#=> SELECT `products`.* FROM `products` WHERE (`products`.`price` < 1000)

より大きい: gt

1000より大きい数を検索する場合の検索条件はこちら

1
2
@products = Product.search(:price_gt => 1000).result
#=> SELECT `products`.* FROM `products` WHERE (`products`.`price` > 1000)

含む: in

1000, 2000を含むレコードを検索する場合はこちら。

1
2
@products = Product.search(:price_in => [1000, 2000]).result
#=> SELECT `products`.* FROM `products` WHERE `products`.`price` IN (1000, 2000)

含まない: not_in

1000, 2000を含まないレコードを検索する場合はこちら。

1
2
@products = Product.search(:price_in => [1000, 2000]).result
#=> SELECT `products`.* FROM `products` WHERE `products`.`price` NOT IN (1000, 2000)

先頭が指定の文字列である: start

先頭の文字列がhogeのレコードを検索する場合。

1
2
@products = Product.search(:name_start => "hoge").result
#=> SELECT `products`.* FROM `products` WHERE (`products`.`name` LIKE 'hoge%')

複数カラムの組合せ: and/or

複数カラムはand/orを使う。

1
2
3
4
5
@products = Product.search(:name_and_maker => "hoge").result
#=> SELECT `products`.* FROM `products` WHERE (`products`.`name` LIKE 'hoge%' AND `products`.`maker` LIKE 'hoge%')

@products = Product.search(:name_or_maker => "hoge").result
#=> SELECT `products`.* FROM `products` WHERE (`products`.`name` LIKE 'hoge%' OR `products`.`maker` LIKE 'hoge%')

複数の条件に全てマッチ: all/any

複数の条件に全てマッチする条件はallを、複数条件のどれかにマッチする条件はanyを用いる。

1
2
@products = Product.search(:name_all => ["hoge", "fuga"]).result
#=> SELECT `products`.* FROM `products` WHERE (`products`.`name` LIKE 'hoge%')

関連テーブルの検索

Prefixをつければ関連テーブルも含めて検索出来ます。

1
2
@products = Product.search(maker_name_cont: "hoge").result
#=> SELECT `products`.* FROM `products` LEFT OUTER JOIN `maker` ON `maker`.`id` = `products`.`maker_id` WHERE (`maker`.`name` LIKE '%hoge%')

公式サイト

最後に公式のGitHubの紹介です。

ernie/ransack · GitHub

Special Thanks

Ransackのススメ #Rails #ransack #Ruby - Qiita

おすすめの書籍