# image_use_gravatar :boolean default(FALSE), not null
# image_content_type :string
# auth_provider :string
+# home_tile :integer
#
# Indexes
#
# 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
after_initialize :set_defaults
before_save :encrypt_password
+ before_save :update_tile
after_save :spam_check
def self.authenticate(options)
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
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
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