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