Commit 756c7f80ccf7a86311569ccd5f4f24dc478dd0b4
Committed by
Antonio Terceiro
1 parent
8ab65398
Exists in
master
and in
29 other branches
ActionItem1225: adding method to count tags
Showing
4 changed files
with
31 additions
and
15 deletions
Show diff stats
app/controllers/public/search_controller.rb
... | ... | @@ -221,10 +221,7 @@ class SearchController < PublicController |
221 | 221 | def tags |
222 | 222 | @tags_cache_key = "tags_env_#{environment.id.to_s}" |
223 | 223 | if is_cache_expired?(@tags_cache_key, true) |
224 | - @tags = environment.tags.inject({}) do |memo,tag| | |
225 | - memo[tag.name] = tag.taggings.count | |
226 | - memo | |
227 | - end | |
224 | + @tags = environment.tags_count | |
228 | 225 | end |
229 | 226 | end |
230 | 227 | ... | ... |
app/models/environment.rb
... | ... | @@ -534,6 +534,15 @@ class Environment < ActiveRecord::Base |
534 | 534 | |
535 | 535 | has_many :tags, :through => :articles |
536 | 536 | |
537 | + def tags_count | |
538 | + options = Article.find_options_for_tag_counts.merge(:conditions => ['profiles.environment_id = ?', self.id]) | |
539 | + options[:joins] = options[:joins] + ' LEFT OUTER JOIN profiles on profiles.id = articles.profile_id' | |
540 | + Tag.find(:all, options).inject({}) do |memo,tag| | |
541 | + memo[tag.name] = tag.count | |
542 | + memo | |
543 | + end | |
544 | + end | |
545 | + | |
537 | 546 | def theme |
538 | 547 | self[:theme] || 'default' |
539 | 548 | end | ... | ... |
app/models/profile.rb
... | ... | @@ -386,19 +386,11 @@ private :generate_url, :url_options |
386 | 386 | environment.domains + domains |
387 | 387 | end |
388 | 388 | |
389 | - # FIXME this can be SLOW | |
390 | 389 | def article_tags |
391 | - totals = {} | |
392 | - articles.each do |article| | |
393 | - article.tags.each do |tag| | |
394 | - if totals[tag.name] | |
395 | - totals[tag.name] += 1 | |
396 | - else | |
397 | - totals[tag.name] = 1 | |
398 | - end | |
399 | - end | |
390 | + articles.tag_counts.inject({}) do |memo,tag| | |
391 | + memo[tag.name] = tag.count | |
392 | + memo | |
400 | 393 | end |
401 | - totals | |
402 | 394 | end |
403 | 395 | |
404 | 396 | def find_tagged_with(tag) | ... | ... |
test/unit/environment_test.rb
... | ... | @@ -804,4 +804,22 @@ class EnvironmentTest < Test::Unit::TestCase |
804 | 804 | |
805 | 805 | assert_equal 4, e.news_amount_by_folder |
806 | 806 | end |
807 | + | |
808 | + should 'list tags with their counts' do | |
809 | + user = create_user('testinguser').person | |
810 | + user.articles.build(:name => 'article 1', :tag_list => 'first-tag').save! | |
811 | + user.articles.build(:name => 'article 2', :tag_list => 'first-tag, second-tag').save! | |
812 | + user.articles.build(:name => 'article 3', :tag_list => 'first-tag, second-tag, third-tag').save! | |
813 | + | |
814 | + assert_equal({ 'first-tag' => 3, 'second-tag' => 2, 'third-tag' => 1 }, Environment.default.tags_count) | |
815 | + end | |
816 | + | |
817 | + should 'not list tags count from other environment' do | |
818 | + e = Environment.create!(:name => 'test_env') | |
819 | + user = create_user('testinguser', :environment => e).person | |
820 | + user.articles.build(:name => 'article 1', :tag_list => 'first-tag').save! | |
821 | + | |
822 | + assert_equal({}, Environment.default.tags_count) | |
823 | + end | |
824 | + | |
807 | 825 | end | ... | ... |