26 July Easy search with ActiveRecord
A couple of minutes ago I released scoped_search, a Rails/ActiveRecord plugin that makes it easy to search your models. It is very easy to use:
Install the plugin in your vendor/plugins directory fromĀ http://github.com/wvanbergen/scoped_search
Add the gem to your railsenvironment.rb:config.gem 'wvanbergen-scoped_search', :lib => 'scoped_search', :source => 'http://gems.github.com'
Call
rake gems:installafterwards to ensure the gem is installed.- Define in what fields your model should be searched by calling
searchable_on :some, :field, :names - Find your records by calling
search_for("query keywords")
That’s all! A short example:
class Project < ActiveRecord::Base searchable_on :name, :description end Project.search_for("search keywords").each do |project| puts project.name end # SELECT * FROM projects WHERE # (name LIKE '%search%' OR description LIKE '%search%') # AND (name LIKE '%keywords%' OR description LIKE '%keywords%')
This functionality is completely build upon named_scope. The search_for method is actually a named scope that was created by the call to searchable_on. Because these scopes can be chained, this offers some great possibilities.
For example, in Floorplanner, we only want you to search on the projects you have access to. We have implemented this access logic in another named scope. The calls can simply be chained:
class Project < ActiveRecord::Base searchable_on :name, :description named_scope :accessible_by, lambda { |user| ... } named_scope :published, :conditions => 'published_at IS NOT NULL' end @projects = Project.accessible_by(current_user).published.search_for('query') @projects.each { |project| ... }
This plugin is released under the MIT license, so please use it for any purpose you see fit. There are some TODOs: you currently can not search on fields in other tables, and splitting the search string into keywords is very basic. Please contact me if you have implemented any of these features and you are willing to share them! Do not hesitate to contact me in case or problems either.
Update: I added support for quotes and the minus sign to the query language:
Project.search_for('willem -"van bergen"').count
Update #2: Wes Hays implemented the OR keyword:
Project.search_for('wes OR hays').count.
A big thanks to Wes for helping out on this project!!
5 Comments - Tags: ActiveRecord, named_scope, rails, scoped_search, searching


