64 lines
1.6 KiB
Ruby
64 lines
1.6 KiB
Ruby
class CategoryFeaturedUser < ActiveRecord::Base
|
|
belongs_to :category
|
|
belongs_to :user
|
|
|
|
def self.max_featured_users
|
|
5
|
|
end
|
|
|
|
def self.feature_users_in(category_or_category_id)
|
|
category_id =
|
|
if Fixnum === category_or_category_id
|
|
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
|
|
|
|
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
|
|
|
|
transaction do
|
|
CategoryFeaturedUser.delete_all category_id: category_id
|
|
user_ids.each do |user_id|
|
|
create(category_id: category_id, user_id: user_id)
|
|
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
|
|
#
|
|
|