From 58de12df5eaa43c3d8c9049e5a8158756d9ef355 Mon Sep 17 00:00:00 2001 From: maxwell Date: Fri, 6 Aug 2010 16:35:02 -0700 Subject: [PATCH 1/2] DG MS; PeopleController#index now accepts query string for search (only looks at first_name and last_name) --- app/controllers/people_controller.rb | 8 ++- app/models/person.rb | 8 +-- spec/controllers/people_controller_spec.rb | 61 ++++++++++++++++++++++ 3 files changed, 73 insertions(+), 4 deletions(-) create mode 100644 spec/controllers/people_controller_spec.rb diff --git a/app/controllers/people_controller.rb b/app/controllers/people_controller.rb index 25fcdf2af..4c186569f 100644 --- a/app/controllers/people_controller.rb +++ b/app/controllers/people_controller.rb @@ -2,7 +2,13 @@ class PeopleController < ApplicationController before_filter :authenticate_user! def index - @people = Person.friends.paginate :page => params[:page], :order => 'created_at DESC' + unless params[:q] + @people = Person.friends.paginate :page => params[:page], :order => 'created_at DESC' + render :index + else + @people = Person.search_for_friends(params[:q]) + render :xml => @people + end end def show diff --git a/app/models/person.rb b/app/models/person.rb index bc6e586ec..ee7ad104f 100644 --- a/app/models/person.rb +++ b/app/models/person.rb @@ -30,9 +30,11 @@ class Person after_destroy :remove_all_traces - scope :friends, where(:_type => "Person", :active => true) - - + scope :friends, where(:_type => "Person", :active => true) + + def self.search_for_friends(query) + Person.all('$where' => "function() { return this.profile.first_name.match(/^#{query}/i) || this.profile.last_name.match(/^#{query}/i); }") + end def real_name "#{profile.first_name.to_s} #{profile.last_name.to_s}" diff --git a/spec/controllers/people_controller_spec.rb b/spec/controllers/people_controller_spec.rb new file mode 100644 index 000000000..f0cea0279 --- /dev/null +++ b/spec/controllers/people_controller_spec.rb @@ -0,0 +1,61 @@ +require File.dirname(__FILE__) + '/../spec_helper' + +describe PeopleController do + render_views + before do + @user = Factory.create(:user, :profile => Profile.new( :first_name => "bob", :last_name => "smith")) + request.env['warden'] = mock_model(Warden, :authenticate? => @user, :authenticate! => @user, :authenticate => @user) + + sign_in :user, @user + end + + it "index should yield search results for substring of person name" do + friend_one = Factory.create(:person) + friend_two = Factory.create(:person) + friend_three = Factory.create(:person) + friend_four = Factory.create(:person) + + friend_one.profile.first_name = "Robert" + friend_one.profile.last_name = "Grimm" + friend_one.profile.save + + friend_two.profile.first_name = "Eugene" + friend_two.profile.last_name = "Weinstein" + friend_two.save + + friend_three.profile.first_name = "Yevgeniy" + friend_three.profile.last_name = "Dodis" + friend_three.save + + friend_four.profile.first_name = "Casey" + friend_four.profile.last_name = "Grippi" + friend_four.save + + + puts Person.friends.count + + get :index, :q => "Eu" + + + assigns[:people].include?(friend_two).should == true + assigns[:people].include?(friend_one).should == false + assigns[:people].include?(friend_three).should == false + assigns[:people].include?(friend_four).should == false + + get :index, :q => "Wei" + assigns[:people].include?(friend_two).should == true + assigns[:people].include?(friend_one).should == false + assigns[:people].include?(friend_three).should == false + assigns[:people].include?(friend_four).should == false + + get :index, :q => "Gri" + assigns[:people].include?(friend_one).should == true + assigns[:people].include?(friend_four).should == true + assigns[:people].include?(friend_two).should == false + assigns[:people].include?(friend_three).should == false + + get :index + assigns[:people].should == Person.friends.all + end + +end From f4ca29da416f2f2c5becab315d4c0648c36128b5 Mon Sep 17 00:00:00 2001 From: maxwell Date: Fri, 6 Aug 2010 17:19:33 -0700 Subject: [PATCH 2/2] PeopleController now renders json when given a query. Unfortunately, it only renders the matching friend ids without first or last names... --- app/controllers/people_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/people_controller.rb b/app/controllers/people_controller.rb index 4c186569f..ec9826967 100644 --- a/app/controllers/people_controller.rb +++ b/app/controllers/people_controller.rb @@ -7,7 +7,7 @@ class PeopleController < ApplicationController render :index else @people = Person.search_for_friends(params[:q]) - render :xml => @people + render :json => @people.to_json(:only => :_id) end end