mirror of
https://github.com/discourse/discourse.git
synced 2025-02-25 18:55:32 -06:00
Add score, percent_rank to topics. Adds HotTopic model and consolidated job to calculate
hotness. Note: People on Heroku will have to update their jobs to the new structure in Heroku.md
This commit is contained in:
60
app/models/hot_topic.rb
Normal file
60
app/models/hot_topic.rb
Normal file
@@ -0,0 +1,60 @@
|
||||
class HotTopic < ActiveRecord::Base
|
||||
|
||||
belongs_to :topic
|
||||
belongs_to :category
|
||||
|
||||
|
||||
# Here's the current idea behind the implementaiton of hot: random can produce good results!
|
||||
# Hot is currently made up of a random selection of high percentile topics. It includes mostly
|
||||
# new topics, but also some old ones for variety.
|
||||
def self.refresh!
|
||||
transaction do
|
||||
exec_sql "DELETE FROM hot_topics"
|
||||
|
||||
# TODO, move these to site settings once we're sure this is how we want to figure out hot
|
||||
max_hot_topics = 200 # how many hot topics we want
|
||||
hot_percentile = 0.2 # What percentile of topics we consider good
|
||||
older_percentage = 0.2 # how many old topics we want as a percentage
|
||||
new_days = 21 # how many days old we consider old
|
||||
|
||||
exec_sql("INSERT INTO hot_topics (topic_id, category_id, score)
|
||||
SELECT t.id,
|
||||
t.category_id,
|
||||
RANDOM()
|
||||
FROM topics AS t
|
||||
WHERE t.deleted_at IS NULL
|
||||
AND t.visible
|
||||
AND (NOT t.closed)
|
||||
AND (NOT t.archived)
|
||||
AND t.archetype <> :private_message
|
||||
AND created_at >= (CURRENT_TIMESTAMP - INTERVAL ':days_ago' DAY)
|
||||
AND t.percent_rank < :hot_percentile
|
||||
ORDER BY 3 DESC
|
||||
LIMIT :limit",
|
||||
hot_percentile: hot_percentile,
|
||||
limit: ((1.0 - older_percentage) * max_hot_topics).round,
|
||||
private_message: Archetype::private_message,
|
||||
days_ago: new_days)
|
||||
|
||||
# Add a sprinkling of random older topics
|
||||
exec_sql("INSERT INTO hot_topics (topic_id, category_id, score)
|
||||
SELECT t.id,
|
||||
t.category_id,
|
||||
RANDOM()
|
||||
FROM topics AS t
|
||||
WHERE t.deleted_at IS NULL
|
||||
AND t.visible
|
||||
AND (NOT t.closed)
|
||||
AND (NOT t.archived)
|
||||
AND t.archetype <> :private_message
|
||||
AND created_at < (CURRENT_TIMESTAMP - INTERVAL ':days_ago' DAY)
|
||||
AND t.percent_rank < :hot_percentile
|
||||
LIMIT :limit",
|
||||
hot_percentile: hot_percentile,
|
||||
limit: (older_percentage * max_hot_topics).round,
|
||||
private_message: Archetype::private_message,
|
||||
days_ago: new_days)
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
@@ -38,6 +38,8 @@ class Topic < ActiveRecord::Base
|
||||
has_many :posts
|
||||
has_many :topic_allowed_users
|
||||
has_many :allowed_users, through: :topic_allowed_users, source: :user
|
||||
|
||||
has_one :hot_topic
|
||||
belongs_to :user
|
||||
belongs_to :last_poster, class_name: 'User', foreign_key: :last_post_user_id
|
||||
belongs_to :featured_user1, class_name: 'User', foreign_key: :featured_user1_id
|
||||
|
||||
Reference in New Issue
Block a user