Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Easily search you ActiveRecord models with a simple query language using a named scope.

Fetching latest commit…

Cannot retrieve the latest commit at this time

Failed to load latest commit information.
lib
test
.gitignore
.manifest
CHANGELOG
LICENSE
README.textile
Rakefile
TODO
init.rb
scoped_search.gemspec

README.textile

scoped_search

This simple plugin will make 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 conditions for searching (ILIKE for Postgres). You can specify what fields should be used for searching.


h2. Installing scoped_search


gem install wvanbergen-scoped_search


h2. 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: > mm/dd/yyyy, < yyyy-mm-dd

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)


h2. License

This plugin is released under the MIT license. Please contact (willem AT vanbergen DOT org) if you have any suggestions or remarks.

Something went wrong with that request. Please try again.