live search with one input field for few columns

Hello In Rails Cookbook is example of live search. There is one input field and we are looking for word (words) in TITLE column.

code: def self.search(terms)   find :all,      :conditions =>      [(["(LOWER(title) LIKE ?)"] * terms.size ).join(" AND "), * terms.flatten] end # terms is an array with word (words)

My question is: How to change SEARCH function to search word (words) in more then one column eg. TITLE, BODY ... Greate example of live search is here: www.gotapi.com

Greetings

This is so ugly, I can't believe I'm posting it...

[ "(" + (["LOWER(title) LIKE ?"] * terms.size).join(" AND ") + ")" + " OR " + "(" + (["LOWER(body) LIKE ?"] * terms.size).join(" AND ") + ")", * terms.flatten * 2 ]

Be careful with the line breaks or it won't work.

One problem with this (besides the field names being hard coded and it being a big, ugly mess) is that it will only find matches for one field. In other words, if a user entered "My favorite poem", there would only be a match if all of those words were in the title OR if all of those words were in the body - it won't find the "poem" if its title is "My Favorite Things" and the body contains "poem".

Also, I assume that you have something like this in your code to put the wildcard characters in with your search terms:

terms.map {|t| "%#{t}%"}

If you're doing more advanced searching, you might look into some plugins. I've heard many people talk about acts_as_ferret (with mixed reactions). Another option could be to allow the user to select what field he wants to search with a radio button list that corresponds to the possible search fields. You could then pass this value into a "field" variable for the search (i.e., "LOWER(#{field}) LIKE ?"...).

If you need something to work quickly, go ahead and try my solution. If you need something to work *well*, you might want to look elsewhere. :slight_smile:

-Kyle