簡易キーワード検索

以下の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は全くしてないし...ん〜