From c282a3dec9b67fab8d65736256ed4032254e67aa Mon Sep 17 00:00:00 2001 From: Larissa Reis Date: Thu, 26 Jun 2014 00:37:21 -0300 Subject: [PATCH] invite-members: uses the default find_by_content infra-structure --- app/controllers/application_controller.rb | 2 +- app/controllers/public/invite_controller.rb | 5 +---- lib/noosfero/core_ext/active_record.rb | 30 ++++++++++++++++++++++++------ 3 files changed, 26 insertions(+), 11 deletions(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 4d5b012..513b949 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -181,7 +181,7 @@ class ApplicationController < ActionController::Base private def fallback_find_by_contents(asset, scope, query, paginate_options, options) - scope = scope.like_search(query) unless query.blank? + scope = scope.like_search(query, options) unless query.blank? scope = scope.send(options[:filter]) unless options[:filter].blank? {:results => scope.paginate(paginate_options)} end diff --git a/app/controllers/public/invite_controller.rb b/app/controllers/public/invite_controller.rb index 4d68159..0e8bb65 100644 --- a/app/controllers/public/invite_controller.rb +++ b/app/controllers/public/invite_controller.rb @@ -78,10 +78,7 @@ class InviteController < PublicController def search_friend fields = %w[name identifier email] + plugins_options.map {|field| field[:field].to_s } - values = ["%#{params['q']}%"] * fields.count - render :text => environment.people.find(:all, :joins => ['INNER JOIN users ON profiles.user_id=users.id'], :conditions => [fields.map {|field| "LOWER(#{field}) LIKE ?"}.join(' OR '), *values]). - select {|person| !profile.members.include?(person) }. - map {|person| {:id => person.id, :name => person.name} }.to_json + render :text => find_by_contents(:people, environment.people, params['q'], {:page => 1}, {:fields => fields, :joins => :user})[:results].select {|person| !profile.members.include?(person) }.map {|person| {:id => person.id, :name => person.name} }.to_json end protected diff --git a/lib/noosfero/core_ext/active_record.rb b/lib/noosfero/core_ext/active_record.rb index f31583e..e91ae1d 100644 --- a/lib/noosfero/core_ext/active_record.rb +++ b/lib/noosfero/core_ext/active_record.rb @@ -13,14 +13,32 @@ class ActiveRecord::Base key.join('/') end - def self.like_search(query) - if defined?(self::SEARCHABLE_FIELDS) - fields = self::SEARCHABLE_FIELDS.keys.map(&:to_s) & column_names + def self.like_search(query, options={}) + if defined?(self::SEARCHABLE_FIELDS) || options[:fields].present? + fields_per_table = {} + fields_per_table[table_name] = (options[:fields].present? ? options[:fields] : self::SEARCHABLE_FIELDS.keys.map(&:to_s)) & column_names + + if options[:joins].present? + join_asset = options[:joins].to_s.classify.constantize + if defined?(join_asset::SEARCHABLE_FIELDS) || options[:fields].present? + fields_per_table[join_asset.table_name] = (options[:fields].present? ? options[:fields] : join_asset::SEARCHABLE_FIELDS.keys.map(&:to_s)) & join_asset.column_names + end + end + query = query.downcase.strip - conditions = fields.map do |field| - "lower(#{table_name}.#{field}) LIKE '%#{query}%'" + fields_per_table.delete_if { |table,fields| fields.blank? } + conditions = fields_per_table.map do |table,fields| + fields.map do |field| + "lower(#{table}.#{field}) LIKE '%#{query}%'" + end.join(' OR ') end.join(' OR ') - where(conditions) + + if options[:joins].present? + joins(options[:joins]).where(conditions) + else + where(conditions) + end + else raise "No searchable fields defined for #{self.name}" end -- libgit2 0.21.2