筆者環境
環境 | バージョン | 備考 |
---|---|---|
MacOSX | 10.9.2 | MacBookProRatina |
Homebrew | 0.9.5 | |
Ruby | 2.1.0 | 最新バージョン |
Rails | 3.1.0,4.0.3 | 3系,4系ともに高負荷(月間100万PV)にて実績 |
普段、solorの全文検索を使っていますが、スコープを書いてみたので、活用してみてください。
検索条件
1.前後トリムしたい。
例:「 テスト 」 => 「テスト」
2.スペースで値をor検索したい。
例:「鈴木 イチロー」 => 「鈴木とイチローを検索条件にしたい。」
scope :searchstring, ->(search_string){
tokens = search_string.split(' ').map { |c| "%#{c.downcase}%" }
if tokens.present?
users = users.where((['( name like ? )']*tokens.size).join(' AND '),
*tokens.map { |token| [token] * 1 }.flatten)
end
users
}
User.searchstring("鈴木 イチロー").to_sql
=>
SELECT `users`.* FROM `users ` WHERE `users `.`deleted_at` IS NULL AND (( name like '%鈴木%' ) AND ( name like '%イチロー%' ))
User. searchstring("鈴 イチロー 木").to_sql
=>
SELECT `users`.* FROM `users ` WHERE `users `.`deleted_at` IS NULL AND (( name like '%鈴%' ) AND ( name like '%イチロー%' ) AND ( name like '%木%' ))
のように半角スペースで繋げた分だけLIKE検索が出来るscopeの完成!
全角スペースで繋げた場合の対策はしていないので、詳しい解説とか希望あれば書きます。