public
Rubygem
Description: Easily search you ActiveRecord models using a named_scope
Homepage: http://techblog.floorplanner.com/2008/07/26/easy-search-with-activerecord/
Clone URL: git://github.com/wvanbergen/scoped_search.git
name age message
file .gitignore Mon Feb 23 12:14:44 -0800 2009 Added support for integer|int fields [Wes Hays]
file LICENSE Wed Sep 03 06:09:10 -0700 2008 Relicensed to MIT [wvanbergen]
file README.rdoc Thu Jan 29 23:00:23 -0800 2009 README adjustments [wvanbergen]
file Rakefile Sun Feb 01 10:23:22 -0800 2009 Moved rdoc, rcov and rcov_display to the docume... [Wes Hays]
file init.rb Wed Sep 03 22:59:07 -0700 2008 Converted to gem [wvanbergen]
directory lib/ Thu Jun 18 10:40:43 -0700 2009 making sure this code works in 1.8 and 1.9 of r... [Angelo Lakra]
file scoped_search.gemspec Thu Jun 18 10:53:27 -0700 2009 Fixed gemspec file [wvanbergen]
directory tasks/ Tue Feb 24 23:24:52 -0800 2009 Adjusted commit messages [wvanbergen]
directory test/ Mon Feb 23 12:14:44 -0800 2009 Added support for integer|int fields [Wes Hays]

scoped_search

The scoped_search Rails plugin makes it easy to search your ActiveRecord models. Searching is performed using a query string, which should be passed to the named_scope search_for that uses SQL LIKE %keyword% conditions for searching (ILIKE for Postgres). You can specify what fields should be used for searching.

Installing

The recommended method to enable scoped_search in your project is adding the scoped_search gem to your environment. Add the following code to your Rails configuration in config/environment.rb:

  Rails::Initializer.run do |config|
    ...
    config.gem 'wvanbergen-scoped_search', :lib => 'scoped_search',
                   source => 'http://gems.github.com/'
  end

Run sudo rake gems:install to install the gem.

Another alternative is to install scoped_search as a Rails plugin:

  script/plugin install git://github.com/wvanbergen/scoped_search.git

Usage

First, you have to specify in what columns should be searched:

  class User < ActiveRecord::Base
    searchable_on :first_name, :last_name
  end

Now, the search_for scope is available for queries. You should pass a query string to the scope. This can be empty or nil, in which case all no search conditions are set (and all records will be returned).

  User.search_for(params[:q]).each { |project| ... }

You can also search on associate models. This works with belongs_to, has_one, has_many, has_many :through, and HABTM. For example if a User has_many Notes (title, content, created_at, updated_at)

  class User < ActiveRecord::Base
    has_many: notes
    searchable_on :first_name, :last_name, :notes_title, :notes_content
  end

The search query language is simple. It supports these constructs:

  • words: some search keywords
  • phrases: "a single search phrase"
  • negation: "look for this" -"but do not look for this phrase and this" -word
  • OR words/phrases: word/phrase OR word/phrase. Example: "Hello World" OR "Hello Moon"
  • dates: mm/dd/yyyy, dd/mm/yyyy, yyyy/mm/dd, yyyy-mm-dd
  • date ranges: > date, >= date, < date, <= date, date TO date. Examples: > 30/05/1983, < 2009-01-30

This functionality is build on named_scope. The searchable_on statement creates a named_scope search_for. Because of this, you can actually chain the call with other scopes. For example, this can be very useful if you only want to search in projects that are accessible by a given user.

  class Project < ActiveRecord::Base
    searchable_on :name, :description
    named_scope :accessible_by, lambda { |user| ... }
  end

  # using chained named_scopes and will_paginate
  Project.accessible_by(current_user).search_for(params[:q]).paginate(:page => params[:page], :include => :tasks)

Additional resources

License

This plugin is released under the MIT license. Please contact weshays (github.com/weshays) or wvanbergen (github.com/wvanbergen) for any questions.