Extracted featured_users functionality out of Topic.

* Created a TopicFeatureUsers model
* Topic#featured_user_ids and Topic#feature_topic_users now delegate to
* a TopicFeatureUsers instance to keep demeter happy.
This commit is contained in:
Einar Jonsson 2013-08-26 10:41:56 +00:00
parent 7787770758
commit b385cdcc34
2 changed files with 62 additions and 37 deletions

View File

@ -15,11 +15,19 @@ class Topic < ActiveRecord::Base
2**31 - 1 2**31 - 1
end end
def self.featured_users_count versioned if: :new_version_required?
4
def featured_users
@featured_users ||= TopicFeaturedUsers.new(self)
end end
versioned if: :new_version_required? def featured_user_ids
featured_users.user_ids
end
def feature_topic_users(args={})
featured_users.choose(args)
end
def trash!(trashed_by=nil) def trash!(trashed_by=nil)
update_category_topic_count_by(-1) if deleted_at.nil? update_category_topic_count_by(-1) if deleted_at.nil?
@ -368,9 +376,6 @@ class Topic < ActiveRecord::Base
changed_to_category(cat) changed_to_category(cat)
end end
def featured_user_ids
[featured_user1_id, featured_user2_id, featured_user3_id, featured_user4_id].uniq.compact
end
def remove_allowed_user(username) def remove_allowed_user(username)
user = User.where(username: username).first user = User.where(username: username).first
@ -466,13 +471,6 @@ class Topic < ActiveRecord::Base
end end
end end
# Chooses which topic users to feature
def feature_topic_users(args={})
reload unless rails4?
clear_featured_users
update_featured_users featured_user_keys(args)
save
end
def posters_summary(options = {}) def posters_summary(options = {})
@posters_summary ||= TopicPostersSummary.new(self, options).summary @posters_summary ||= TopicPostersSummary.new(self, options).summary
@ -624,30 +622,6 @@ class Topic < ActiveRecord::Base
end end
end end
def featured_user_keys(args)
# Don't include the OP or the last poster
to_feature = posts.where('user_id NOT IN (?, ?)', user_id, last_post_user_id)
# Exclude a given post if supplied (in the case of deletes)
to_feature = to_feature.where("id <> ?", args[:except_post_id]) if args[:except_post_id].present?
# Assign the featured_user{x} columns
to_feature.group(:user_id).order('count_all desc').limit(Topic.featured_users_count).count.keys
end
def clear_featured_users
Topic.featured_users_count.times do |i|
send("featured_user#{i+1}_id=", nil)
end
end
def update_featured_users(user_keys)
user_keys.each_with_index do |user_id, i|
send("featured_user#{i+1}_id=", user_id)
end
end
end end
# == Schema Information # == Schema Information

View File

@ -0,0 +1,51 @@
class TopicFeaturedUsers
attr_reader :topic
def initialize(topic)
@topic = topic
end
def self.count
4
end
# Chooses which topic users to feature
def choose(args={})
topic.reload unless rails4?
clear
update keys(args)
topic.save
end
def user_ids
[topic.featured_user1_id,
topic.featured_user2_id,
topic.featured_user3_id,
topic.featured_user4_id].uniq.compact
end
private
def keys(args)
# Don't include the OP or the last poster
to_feature = topic.posts.where('user_id NOT IN (?, ?)', topic.user_id, topic.last_post_user_id)
# Exclude a given post if supplied (in the case of deletes)
to_feature = to_feature.where("id <> ?", args[:except_post_id]) if args[:except_post_id].present?
# Assign the featured_user{x} columns
to_feature.group(:user_id).order('count_all desc').limit(TopicFeaturedUsers.count).count.keys
end
def clear
TopicFeaturedUsers.count.times do |i|
topic.send("featured_user#{i+1}_id=", nil)
end
end
def update(user_keys)
user_keys.each_with_index do |user_id, i|
topic.send("featured_user#{i+1}_id=", user_id)
end
end
end