]> git.openstreetmap.org Git - rails.git/blobdiff - app/models/user.rb
Use home_tile to find nearby users
[rails.git] / app / models / user.rb
index 7a8414ec073c177940ad9601511467d7d89c96e2..d7cd8c8b83d4e7d31466f657ff9883a95406b6fb 100644 (file)
@@ -33,6 +33,7 @@
 #  image_use_gravatar  :boolean          default(FALSE), not null
 #  image_content_type  :string
 #  auth_provider       :string
+#  home_tile           :integer
 #
 # Indexes
 #
@@ -41,6 +42,7 @@
 #  users_display_name_lower_idx  (lower((display_name)::text))
 #  users_email_idx               (email) UNIQUE
 #  users_email_lower_idx         (lower((email)::text))
+#  users_home_idx                (home_tile)
 #
 
 class User < ActiveRecord::Base
@@ -107,6 +109,7 @@ class User < ActiveRecord::Base
 
   after_initialize :set_defaults
   before_save :encrypt_password
+  before_save :update_tile
   after_save :spam_check
 
   def self.authenticate(options)
@@ -187,8 +190,14 @@ class User < ActiveRecord::Base
   def nearby(radius = NEARBY_RADIUS, num = NEARBY_USERS)
     if home_lon && home_lat
       gc = OSM::GreatCircle.new(home_lat, home_lon)
+      sql_for_area = QuadTile.sql_for_area(gc.bounds(radius), "home_")
       sql_for_distance = gc.sql_for_distance("home_lat", "home_lon")
-      nearby = User.where("id != ? AND status IN (\'active\', \'confirmed\') AND data_public = ? AND #{sql_for_distance} <= ?", id, true, radius).order(sql_for_distance).limit(num)
+      nearby = User.active.identifiable
+                   .where("id != ?", id)
+                   .where(sql_for_area)
+                   .where("#{sql_for_distance} <= ?", radius)
+                   .order(sql_for_distance)
+                   .limit(num)
     else
       nearby = []
     end
@@ -261,8 +270,8 @@ class User < ActiveRecord::Base
   def spam_score
     changeset_score = changesets.size * 50
     trace_score = traces.size * 50
-    diary_entry_score = diary_entries.inject(0) { |acc, elem| acc + elem.body.spam_score }
-    diary_comment_score = diary_comments.inject(0) { |acc, elem| acc + elem.body.spam_score }
+    diary_entry_score = diary_entries.visible.inject(0) { |acc, elem| acc + elem.body.spam_score }
+    diary_comment_score = diary_comments.visible.inject(0) { |acc, elem| acc + elem.body.spam_score }
 
     score = description.spam_score / 4.0
     score += diary_entries.where("created_at > ?", 1.day.ago).count * 10
@@ -277,9 +286,7 @@ class User < ActiveRecord::Base
   ##
   # perform a spam check on a user
   def spam_check
-    if status == "active" && spam_score > SPAM_THRESHOLD
-      update(:status => "suspended")
-    end
+    update(:status => "suspended") if status == "active" && spam_score > SPAM_THRESHOLD
   end
 
   ##
@@ -300,4 +307,8 @@ class User < ActiveRecord::Base
       self.pass_crypt_confirmation = nil
     end
   end
+
+  def update_tile
+    self.home_tile = QuadTile.tile_for_point(home_lat, home_lon) if home_lat && home_lon
+  end
 end