Railsでスペース区切りで複数キーワードにヒットする検索フォームを実装する方法
Ransackで検索機能を実装しようと思ったのですが、スペース区切りでヒットする検索が実装できませんでした。
例
・検索する文
「Railsでスペース区切りで複数キーワードにヒットする検索フォームを実装する方法」
・検索キーワード
[Rails]→ヒット [Rails スペース]→ヒットしない
空白区切りでもヒットする検索を実装してみました。
該当する文があれば、キーワードはいくつでも対応しています。
全角スペース、半角スペースどちらでも対応しています。
例
・検索する文
「Railsでスペース区切りで複数キーワードにヒットする検索フォームを実装する方法」
・検索キーワード
[Rails]→ヒット [Rails スペース]→ヒット [Rails スペース ヒット]
view
form_tagでindexのパスを指定しています。methodは検索なのでgetで指定。
searchアクションに飛ぶように指定します。
prams[:search]でフォームに「検索キーワード」と入力すると:3000/memos?utf8=✓&search=検索キーワード&commit=検索
のようなURLが生成されます。
<%= form_tag memos_path,:method => 'get' do %>
<%= text_field_tag :search, params[:search] %>
<%= submit_tag "検索" %>
<% end %>
controller
params[:search]が存在した場合と、しない場合でif文で表示の条件分岐をします。
今回はdeviseでログイン機能を実装していて、ログインしているユーザーのみの検索をしたいので、where(user_id: current_user.id)
でログインしているユーザーのメモのみ表示します。
def index
@memos = Memo.where(user_id: current_user.id)
if params[:search].present?
@memos = @memos.search(params[:search]).where(user_id: current_user.id)
else
@memos = Memo.where(user_id: current_user.id)
end
end
model
models/memos.rb
def self.search(search)
if search
patterns = search.split(/[ , ]/)
sql_body = ''
patterns.each do | pattern |
sql_body += ' and ' unless sql_body.blank?
sql_body += " body like '%#{pattern}%' "
end
sql = "select * from memos where #{sql_body} order by id desc"
memo_ids = Memo.find_by_sql(sql)
ids = []
memo_ids.each do |qi|
ids.push(qi.id)
end
where(:id => ids)
else
Memo.all
end
end
def self.search(search)
if search
patterns = search.split(/[ , ]/)
sql_body = ''
patterns.each do | pattern |
sql_body += ' and ' unless sql_body.blank?
sql_body += " body like '%#{pattern}%' "
end
sql = "select * from memos where #{sql_body} order by id desc"
memo_ids = Memo.find_by_sql(sql)
ids = []
memo_ids.each do |qi|
ids.push(qi.id)
end
where(:id => ids)
else
Memo.all
end
end
Author And Source
この問題について(Railsでスペース区切りで複数キーワードにヒットする検索フォームを実装する方法), 我々は、より多くの情報をここで見つけました https://qiita.com/ihatov08/items/461408896598bcc99cba著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .