Commit 756c7f80ccf7a86311569ccd5f4f24dc478dd0b4
Committed by
Antonio Terceiro
1 parent
8ab65398
Exists in
master
and in
28 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 | ... | ... |