Permalink
Browse files

Extract search logic to UserSearch model

  • Loading branch information...
1 parent 0136727 commit 972b9d735c9bc07963d77cc53a07ef9bbe0a0e45 @blowmage committed Feb 7, 2013
Showing with 39 additions and 32 deletions.
  1. +1 −32 app/controllers/users_controller.rb
  2. +38 −0 app/models/user_search.rb
@@ -288,43 +288,12 @@ def activate_account
end
def search_users
-
term = (params[:term] || "").strip.downcase
topic_id = params[:topic_id]
topic_id = topic_id.to_i if topic_id
- sql = "select username, name, email from users u "
- if topic_id
- sql << "left join (select distinct p.user_id from posts p where topic_id = :topic_id) s on
- s.user_id = u.id "
- end
-
- if term.length > 0
- sql << "where username_lower like :term_like or
- to_tsvector('simple', name) @@
- to_tsquery('simple',
- regexp_replace(
- regexp_replace(
- cast(plainto_tsquery(:term) as text)
- ,'\''(?: |$)', ':*''', 'g'),
- '''', '', 'g')
- ) "
-
- end
+ results = UserSearch.search term, topic_id
- sql << "order by case when username_lower = :term then 0 else 1 end asc, "
- if topic_id
- sql << " case when s.user_id is null then 0 else 1 end desc, "
- end
-
- sql << " case when last_seen_at is null then 0 else 1 end desc, last_seen_at desc, username asc limit(20)"
-
- results = User.exec_sql(sql, topic_id: topic_id, term_like: "#{term}%", term: term)
- results = results.map do |r|
- r["avatar_template"] = User.avatar_template(r["email"])
- r.delete("email")
- r
- end
render :json => results
end
@@ -0,0 +1,38 @@
+class UserSearch
+
+ def self.search term, topic_id
+ sql = "select username, name, email from users u "
+ if topic_id
+ sql << "left join (select distinct p.user_id from posts p where topic_id = :topic_id) s on
+ s.user_id = u.id "
+ end
+
+ if term.length > 0
+ sql << "where username_lower like :term_like or
+ to_tsvector('simple', name) @@
+ to_tsquery('simple',
+ regexp_replace(
+ regexp_replace(
+ cast(plainto_tsquery(:term) as text)
+ ,'\''(?: |$)', ':*''', 'g'),
+ '''', '', 'g')
+ ) "
+
+ end
+
+ sql << "order by case when username_lower = :term then 0 else 1 end asc, "
+ if topic_id
+ sql << " case when s.user_id is null then 0 else 1 end desc, "
+ end
+
+ sql << " case when last_seen_at is null then 0 else 1 end desc, last_seen_at desc, username asc limit(20)"
+
+ results = User.exec_sql(sql, topic_id: topic_id, term_like: "#{term}%", term: term)
+ results = results.map do |r|
+ r["avatar_template"] = User.avatar_template(r["email"])
+ r.delete("email")
+ r
+ end
+ end
+
+end

0 comments on commit 972b9d7

Please sign in to comment.