Class: SuggestedTopicsBuilder
- Inherits:
-
Object
- Object
- SuggestedTopicsBuilder
- Defined in:
- lib/suggested_topics_builder.rb
Instance Attribute Summary collapse
-
#excluded_topic_ids ⇒ Object
readonly
Returns the value of attribute excluded_topic_ids.
Instance Method Summary collapse
- #add_results(results, priority = :low) ⇒ Object
- #category_results_left ⇒ Object
- #full? ⇒ Boolean
-
#initialize(topic) ⇒ SuggestedTopicsBuilder
constructor
A new instance of SuggestedTopicsBuilder.
- #results ⇒ Object
- #results_left ⇒ Object
- #size ⇒ Object
- #splice_results(results, priority) ⇒ Object
Constructor Details
#initialize(topic) ⇒ SuggestedTopicsBuilder
Returns a new instance of SuggestedTopicsBuilder.
6 7 8 9 10 11 |
# File 'lib/suggested_topics_builder.rb', line 6 def initialize(topic) @excluded_topic_ids = [topic.id] @category_id = topic.category_id @category_topic_ids = Category.topic_ids @results = [] end |
Instance Attribute Details
#excluded_topic_ids ⇒ Object (readonly)
Returns the value of attribute excluded_topic_ids.
4 5 6 |
# File 'lib/suggested_topics_builder.rb', line 4 def excluded_topic_ids @excluded_topic_ids end |
Instance Method Details
#add_results(results, priority = :low) ⇒ Object
13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
# File 'lib/suggested_topics_builder.rb', line 13 def add_results(results, priority = :low) # WARNING .blank? will execute an Active Record query return unless results # Only add results if we don't have those topic ids already results = results.where("topics.id NOT IN (?)", @excluded_topic_ids).where(visible: true) # If limit suggested to category is enabled, restrict to that category if @category_id && SiteSetting.limit_suggested_to_category? results = results.where(category_id: @category_id) end results = results.to_a results.reject! { |topic| @category_topic_ids.include?(topic.id) } unless results.empty? # protect against dupes temp = results results = [] temp.each do |r| if !@excluded_topic_ids.include?(r.id) results << r @excluded_topic_ids << r.id end end results = DiscoursePluginRegistry.apply_modifier(:suggested_topics_add_results, results) splice_results(results, priority) end end |
#category_results_left ⇒ Object
76 77 78 |
# File 'lib/suggested_topics_builder.rb', line 76 def category_results_left SiteSetting.suggested_topics - @results.count { |r| r.category_id == @category_id } end |
#full? ⇒ Boolean
72 73 74 |
# File 'lib/suggested_topics_builder.rb', line 72 def full? results_left <= 0 end |
#results ⇒ Object
64 65 66 |
# File 'lib/suggested_topics_builder.rb', line 64 def results @results.first(SiteSetting.suggested_topics) end |
#results_left ⇒ Object
68 69 70 |
# File 'lib/suggested_topics_builder.rb', line 68 def results_left SiteSetting.suggested_topics - @results.size end |
#size ⇒ Object
80 81 82 |
# File 'lib/suggested_topics_builder.rb', line 80 def size @results.size end |
#splice_results(results, priority) ⇒ Object
44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
# File 'lib/suggested_topics_builder.rb', line 44 def splice_results(results, priority) if priority == :ultra_high @results.insert 0, *results elsif @category_id && priority == :high # Topics from category @category_id need to be first in the list, all others after. other_category_index = @results.index { |r| r.category_id != @category_id } category_results, other_category_results = results.partition { |r| r.category_id == @category_id } if other_category_index @results.insert other_category_index, *category_results else @results.concat category_results end @results.concat other_category_results else @results.concat results end end |