Searching a Model on Multiple Fields

Posted by Mike
Liquid error: wrong number of arguments (5 for 2)

I’m looking for a way to do a complex search across a variable set of multiple fields in a Rails form. In .NET, I’d just build up dynamic SQL by brute force, but that doesn’t seem very Rails-ish, so I went hunting.

  • Use find_by_sql and the join method to build up a condition string. This is essentially the brute force method translated to Rails.
  • Acts_as_Ferret lets you set up full-text searching across multiple fields, but that doesn’t actually fit the requirements.
  • ModelSearch is a plugin that was demoed in one of the talks at RailsConf Europe 2006. It lets you do things like

 search = ProductSearch.new
 search.keyword = 'television'
 search.max_price = 300
 search.sort = :price
 search.find(:all)

This is cool, but it doesn’t seem to have actually been released into the wild yet.

  • ez-where is a plugin from Brainsplat (more info here and here). It enables things like

 articles = Article.find_where(:all) do |article|
   article.title =~ 'Lorem%'
   article.author.name  'Ezra'
   article.comments.user.name  ‘Fab’
 end

  • Squirrel is another plugin inspired by ez-where. It has a similar syntax and includes pagination support.

Right at the moment I’m inclining towards using Squirrel to meet my requirements.