Sha256: 0c275429611fc5b31a4c289316fd9a9565ec1636e10e86b8c7b4e7f7e6e1683c

Contents?: true

Size: 1.34 KB

Versions: 4

Compression:

Stored size: 1.34 KB

Contents

# Provides search for user records.
# origin: M
module User::SearchTrait
  as_trait do

    TEXT_QUERY = /(?:"([^"]+)"|([\w\-@\._]+))/

    # Returns users matching the given query.
    # Users may search additional fields of a user they are friends with.
    # Admins may search all fields.
    def self.search(query, searching_user)
      friend_ids = searching_user.friend_ids
      like_username = find_words_in_field('users.username', query)
      like_full_name = find_words_in_field('users.full_name', query)
      like_email = find_words_in_field('users.email', query)
      conditions = if searching_user.may_search_all_fields_users?
        "(#{like_username}) OR (#{like_full_name}) OR (#{like_email})"
      elsif friend_ids.any?
        is_friend = "users.id IN (#{friend_ids.join ', '})"
        "(#{is_friend}) AND (#{like_full_name}) OR (#{like_username})"
      else
        like_username        
      end
      scoped :conditions => conditions
    end

    private

    def self.find_words_in_field(field, query)
      collect_words(query) do |word|
        sanitize_sql_for_conditions(Util.like_query(field, word))
      end.join(' AND ')
    end

    def self.collect_words(query, &block)
      query.scan(TEXT_QUERY).collect do |phrase_match, word_match|
        word = "#{phrase_match}#{word_match}"
        block.call(word)
      end
    end

  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
serum-rails-0.2.1 spec/test_apps/rails-2-3/app/models/user/search_trait.rb
serum-rails-0.2.0 spec/test_apps/rails-2-3/app/models/user/search_trait.rb
serum-rails-0.1.1 spec/test_app/app/models/user/search_trait.rb
serum-rails-0.1.0 spec/test_app/app/models/user/search_trait.rb