Soulmate Rails is a rails plugin that helps to solve the common problem building auto-completion back-end in rails intuitively. It extends the soulmate gem Soulmate to make it easily pluggable into a rails project.
$ gem install soulmate_rails
OR add this to your Gemfile
:
gem 'soulmate_rails'
Following is an example of how one can use Soulmate Rails for enabling backend autocompletion using redis.
class User < ActiveRecord::Base
autocomplete :first_name, :score => :calculate_score
autocomplete :last_name, :score => :id
def calculate_score
100 / self.id # simple score calculator
end
end
1.9.3p385 :001 > User.create(:first_name => 'First1', :last_name => 'Last1')
1.9.3p385 :002 > User.create(:first_name => 'First2', :last_name => 'Last2')
1.9.3p385 :003 > User.create(:first_name => 'First3', :last_name => 'Last3')
1.9.3p385 :004 > User.search_by_first_name('firs')
=> [#<User:0x000000014bb1e8 @new_record=false,
@attributes={"first_name"=>"First1", "last_name"=>"Last1" "id"=>1},
@changed_attributes={}>, #<User:0x000000014bb1e9 @new_record=false,
@attributes={"first_name"=>"First2", "last_name"=>"Last2" "id"=>2},
@changed_attributes={}>, #<User:0x000000014bb1ea @new_record=false,
@attributes={"first_name"=>"First3", "last_name"=>"Last3" "id"=>3},
@changed_attributes={}>]
1.9.3p385 :005 > User.search_by_last_name('last1')
=> [#<User:0x000000014bb1e8 @new_record=false,
@attributes={"first_name"=>"First1", "last_name"=>"Last1" "id"=>1},
@changed_attributes={}>]
1.9.3p385 :006 > User.search_by_last_name('las')
=> [#<User:0x000000014bb1e8 @new_record=false,
@attributes={"first_name"=>"First3", "last_name"=>"Last3" "id"=>3},
@changed_attributes={}>, #<User:0x000000014bb1e9 @new_record=false,
@attributes={"first_name"=>"First2", "last_name"=>"Last2" "id"=>2},
@changed_attributes={}>, #<User:0x000000014bb1ea @new_record=false,
@attributes={"first_name"=>"First1", "last_name"=>"Last1" "id"=>1},
@changed_attributes={}>]
The autocomplete
method takes 2 arguments :
- attribute name to use for autocompletion.
- options that determine how autocompletion works for indexing.
- Class Methods
search_by(attribute, term, options={})
- Generic method to search by an attribute for which an autocomplete was defined.search_by_#{attribute}(term, options={})
- Specific methods for each attribute autocomplete was defined for.
- Instance Methods
update_index_for(attribute, options={})
update_index_for_#{attribute}
- used in anafter_save
callback to update index for searching.remove_index_for(attribute)
remove_index_for_#{attribute}
- used in abefore_destroy
callback to remove index for searching. Hence you should usedestroy
as opposed todelete
to ensure the callbacks are invoked appropriately by rails and soulmate updates the index.
:score
: This is required. Soulmate uses it for sorting the results (in reverse order, i.e. higher score first). This can be the name of a function or can also be the name of another attribute with integer values.:aliases
: This is optional. Soulmate uses this as aliases for the term field and uses it for searching as well. This can be an array of values or the name of a method which returns an array of values.:data
: This is optional. This can either be the name of a method which returns data or a hash or a string. Once you perform your search usingsearch_by
orsearch_by_#{attribute}
it will set the value of :data corresponding to the object to soulmate_data attr_accessor and can be accessed by calling the soulmate_data accessor on the model object.
Within your rails application inside config/application.rb you can optionally provide redis configuration. Example :
config.soulmate_rails.redis = 'redis://127.0.0.1:6380/0'
# or you can assign an existing instance of Redis, Redis::Namespace, etc.
# config.soulmate_rails.redis = $redis
Alternatively, you can also add configuration in an initializer. Example :
Soulmate.redis = 'redis://127.0.0.1:6380/0'
# or you can assign an existing instance of Redis, Redis::Namespace, etc.
# Soulmate.redis = $redis
- Use Github Issue Tracker to report issues.
- Fork it.
- Commit your changes ( git commit ).
- Push to github ( git push ).
- Open a Pull Request.
Soulmate Rails is released under the MIT License