diff --git a/app/models/debate.rb b/app/models/debate.rb
index 6d6d49a2d..d772ed029 100644
--- a/app/models/debate.rb
+++ b/app/models/debate.rb
@@ -134,6 +134,11 @@ class Debate < ActiveRecord::Base
terms.present? ? where("title ILIKE ? OR description ILIKE ?", "%#{terms}%", "%#{terms}%") : none
end
+ def conflictive?
+ return false unless flags_count > 0 && cached_votes_up > 0
+ flags_count / cached_votes_up.to_f > 0.2
+ end
+
protected
def sanitize_description
diff --git a/app/models/flag.rb b/app/models/flag.rb
index 02b16b385..735ef89e9 100644
--- a/app/models/flag.rb
+++ b/app/models/flag.rb
@@ -1,6 +1,6 @@
class Flag < ActiveRecord::Base
belongs_to :user
- belongs_to :flaggable, polymorphic: true, counter_cache: true
+ belongs_to :flaggable, polymorphic: true, counter_cache: true, touch: true
scope(:by_user_and_flaggable, lambda do |user, flaggable|
where(user_id: user.id,
diff --git a/app/views/debates/show.html.erb b/app/views/debates/show.html.erb
index d1e05d702..1c48ea214 100644
--- a/app/views/debates/show.html.erb
+++ b/app/views/debates/show.html.erb
@@ -13,11 +13,11 @@
<% end %>
<%= @debate.title %>
-
-
- <%= t("debates.show.flag") %>
-
-
+ <% if @debate.conflictive? %>
+
+ <%= t("debates.show.flag") %>
+
+ <% end %>
<%= avatar_image(@debate.author, seed: @debate.author_id, size: 32, class: 'author-photo') %>
diff --git a/spec/factories.rb b/spec/factories.rb
index 0294d5eb8..deaaee98d 100644
--- a/spec/factories.rb
+++ b/spec/factories.rb
@@ -77,6 +77,13 @@ FactoryGirl.define do
trait :with_hot_score do
before(:save) { |d| d.calculate_hot_score }
end
+
+ trait :conflictive do
+ after :create do |debate|
+ Flag.flag(FactoryGirl.create(:user), debate)
+ 4.times { create(:vote, votable: debate) }
+ end
+ end
end
factory :vote do
@@ -88,6 +95,11 @@ FactoryGirl.define do
end
end
+ factory :flag do
+ association :flaggable, factory: :debate
+ association :user, factory: :user
+ end
+
factory :comment do
association :commentable, factory: :debate
user
diff --git a/spec/features/debates_spec.rb b/spec/features/debates_spec.rb
index 07d055ed2..1c8cdf6cc 100644
--- a/spec/features/debates_spec.rb
+++ b/spec/features/debates_spec.rb
@@ -453,4 +453,15 @@ feature 'Debates' do
expect(page).to_not have_content(debate3.title)
end
end
+
+ scenario 'Conflictive' do
+ good_debate = create(:debate)
+ conflictive_debate = create(:debate, :conflictive)
+
+ visit debate_path(conflictive_debate)
+ expect(page).to have_content "This debate has been flag as innapropiate for some users."
+
+ visit debate_path(good_debate)
+ expect(page).to_not have_content "This debate has been flag as innapropiate for some users."
+ end
end
diff --git a/spec/models/debate_spec.rb b/spec/models/debate_spec.rb
index c36031089..a26825f39 100644
--- a/spec/models/debate_spec.rb
+++ b/spec/models/debate_spec.rb
@@ -281,6 +281,11 @@ describe Debate do
.to change { debate.updated_at }
end
+ it "should expire cache when it has a new flag", :focus do
+ expect { create(:flag, flaggable: debate) }
+ .to change { debate.reload.updated_at }
+ end
+
it "should expire cache when it has a new tag" do
expect { debate.update(tag_list: "new tag") }
.to change { debate.updated_at }
@@ -308,4 +313,50 @@ describe Debate do
end
end
+ describe "conflictive debates" do
+
+ it "should return true when it has more than 1 flag for 5 positive votes" do
+ debate.update(flags_count: 1)
+ debate.update(cached_votes_up: 4)
+ expect(debate).to be_conflictive
+
+ debate.update(flags_count: 2)
+ debate.update(cached_votes_up: 9)
+ expect(debate).to be_conflictive
+
+ debate.update(flags_count: 3)
+ debate.update(cached_votes_up: 14)
+ expect(debate).to be_conflictive
+
+ debate.update(flags_count: 20)
+ debate.update(cached_votes_up: 2)
+ expect(debate).to be_conflictive
+ end
+
+ it "should return false when it has less than or equal to 1 flag for 5 positive votes" do
+ debate.update(flags_count: 1)
+ debate.update(cached_votes_up: 5)
+ expect(debate).to_not be_conflictive
+
+ debate.update(flags_count: 2)
+ debate.update(cached_votes_up: 10)
+ expect(debate).to_not be_conflictive
+
+ debate.update(flags_count: 2)
+ debate.update(cached_votes_up: 100)
+ expect(debate).to_not be_conflictive
+ end
+
+ it "should return false when it has no flags" do
+ debate.update(flags_count: 0)
+ expect(debate).to_not be_conflictive
+ end
+
+ it "should return false when it has not votes up" do
+ debate.update(cached_votes_up: 0)
+ expect(debate).to_not be_conflictive
+ end
+
+ end
+
end
\ No newline at end of file