簡易キーワード検索
以下のWebそのままなんだけど,検索を実装してみた.たぶんもっとまともなやり方があるに違いない気がするけど….普通はどうするんだろ?誰か知ってたら教えてくださーい.
http://www.machu.jp/diary/20061008.html
ビュー
- リストページから検索するので,リストのビュー(app/views/books/list.rhtml)にフォームを記述.
<% word = params[:search][:word] if params[:search] %> <%= start_form_tag :action => 'search' %> <%= text_field 'search', 'word', :value => word %> <%= submit_tag 'Search' %> <%= end_form_tag %>
- 検索実行後に表示される,ビュー(app/views/books/serarch.rhtml).基本的には,list.rhtmlと同じでよいはず.
<h1>Search Result</h1> <table class="solid"> <tr> <% for column in Book.content_columns %> <th><%= column.human_name %></th> <% end %> </tr> <% for book in @books %> <tr> <% for column in Book.content_columns %> <td><%=h book.send(column.name) %></td> <% end %> <td><%= link_to 'Show', :action => 'show', :id => book %></td> <td><%= link_to 'Edit', :action => 'edit', :id => book %></td> <td><%= link_to 'Destroy', { :action => 'destroy', :id => book }, :confirm => 'Are you sure?', :method => :post %></td> </tr> <% end %> </table> </br> <%= link_to 'Back', :action => 'list' %>
コントローラ(app/controllers/books_controller.rb)
- search メソッドを記述.モデルにbulltext_searchをつくって投げる.
def search @books = Book.fulltext_search(params[:search][:word]) end
モデル(app/models/book.rb)
- find(:all) の検索条件は,title と review の項目に対するキーワード(word).SQL文が全く分かってないんだけど,like ? というあいまい検索ができるらしい.
def Book.fulltext_search(word, options = {}) options[:conditions] = ["title like ? OR review like ?", "%#{word}%", "%#{word}%"] books = find(:all, options) end
一応,検索はできるようになった.けど,入力が空でも検索されたり,Validationは全くしてないし...ん〜