discourse/app/models/category_featured_user.rb

64 lines
1.7 KiB
Ruby
Raw Normal View History

2013-02-06 03:16:51 +08:00
class CategoryFeaturedUser < ActiveRecord::Base
belongs_to :category
belongs_to :user
def self.max_featured_users
2013-02-07 23:45:24 +08:00
5
2013-02-06 03:16:51 +08:00
end
def self.feature_users_in(category_or_category_id)
category_id =
2017-04-15 12:11:02 +08:00
if category_or_category_id.is_a?(Integer)
category_or_category_id
else
category_or_category_id.id
end
# Figure out most recent posters in the category
most_recent_user_ids = exec_sql "
SELECT x.user_id
FROM (
SELECT DISTINCT ON (p.user_id) p.user_id AS user_id,
p.created_at AS created_at
FROM posts AS p
INNER JOIN topics AS ft ON ft.id = p.topic_id
WHERE ft.category_id = :category_id
AND p.user_id IS NOT NULL
ORDER BY p.user_id, p.created_at DESC
) AS x
ORDER BY x.created_at DESC
LIMIT :max_featured_users;
", category_id: category_id, max_featured_users: max_featured_users
2017-07-28 09:20:09 +08:00
user_ids = most_recent_user_ids.map { |uc| uc['user_id'].to_i }
current = CategoryFeaturedUser.where(category_id: category_id).order(:id).pluck(:user_id)
return if current == user_ids
2013-02-06 03:16:51 +08:00
transaction do
CategoryFeaturedUser.where(category_id: category_id).delete_all
user_ids.each do |user_id|
create(category_id: category_id, user_id: user_id)
2013-02-06 03:16:51 +08:00
end
end
end
end
# == Schema Information
#
# Table name: category_featured_users
#
# id :integer not null, primary key
# category_id :integer
# user_id :integer
# created_at :datetime not null
# updated_at :datetime not null
#
# Indexes
#
# index_category_featured_users_on_category_id_and_user_id (category_id,user_id) UNIQUE
#