Keep a blank line before and after private Keep a blank line before and after protected Remove extra empty line at class body end Remove extra blank line Add final newline Use 2 (not 3) spaces for indentation Use 2 (not 4) spaces for indentation Remove space before comma Add space after comma Remove trailing whitespaces Remove unnecessary spacing Use snake_case for variable names Do not use then for multi-line if Remove unused block argument - i Use the new Ruby 1.9 hash syntax Remove unused assignment to variable Indent when as deep as case Align attributes Align end with def
140 lines
3.7 KiB
Ruby
140 lines
3.7 KiB
Ruby
require 'numeric'
|
|
class Debate < ActiveRecord::Base
|
|
include Flaggable
|
|
include Taggable
|
|
include Conflictable
|
|
include Measurable
|
|
include Sanitizable
|
|
include Searchable
|
|
include Filterable
|
|
|
|
acts_as_votable
|
|
acts_as_paranoid column: :hidden_at
|
|
include ActsAsParanoidAliases
|
|
|
|
belongs_to :author, -> { with_hidden }, class_name: 'User', foreign_key: 'author_id'
|
|
belongs_to :geozone
|
|
has_many :comments, as: :commentable
|
|
|
|
validates :title, presence: true
|
|
validates :description, presence: true
|
|
validates :author, presence: true
|
|
|
|
validates :title, length: { in: 4..Debate.title_max_length }
|
|
validates :description, length: { in: 10..Debate.description_max_length }
|
|
|
|
validates :terms_of_service, acceptance: { allow_nil: false }, on: :create
|
|
|
|
before_save :calculate_hot_score, :calculate_confidence_score
|
|
|
|
scope :for_render, -> { includes(:tags) }
|
|
scope :sort_by_hot_score, -> { reorder(hot_score: :desc) }
|
|
scope :sort_by_confidence_score, -> { reorder(confidence_score: :desc) }
|
|
scope :sort_by_created_at, -> { reorder(created_at: :desc) }
|
|
scope :sort_by_most_commented, -> { reorder(comments_count: :desc) }
|
|
scope :sort_by_random, -> { reorder("RANDOM()") }
|
|
scope :sort_by_relevance, -> { all }
|
|
scope :sort_by_flags, -> { order(flags_count: :desc, updated_at: :desc) }
|
|
scope :last_week, -> { where("created_at >= ?", 7.days.ago)}
|
|
scope :featured, -> { where("featured_at is not null")}
|
|
# Ahoy setup
|
|
visitable # Ahoy will automatically assign visit_id on create
|
|
|
|
attr_accessor :link_required
|
|
|
|
def searchable_values
|
|
{ title => 'A',
|
|
author.username => 'B',
|
|
tag_list.join(' ') => 'B',
|
|
geozone.try(:name) => 'B',
|
|
description => 'D'
|
|
}
|
|
end
|
|
|
|
def self.search(terms)
|
|
self.pg_search(terms)
|
|
end
|
|
|
|
def to_param
|
|
"#{id}-#{title}".parameterize
|
|
end
|
|
|
|
def description
|
|
super.try :html_safe
|
|
end
|
|
|
|
def likes
|
|
cached_votes_up
|
|
end
|
|
|
|
def dislikes
|
|
cached_votes_down
|
|
end
|
|
|
|
def total_votes
|
|
cached_votes_total
|
|
end
|
|
|
|
def total_anonymous_votes
|
|
cached_anonymous_votes_total
|
|
end
|
|
|
|
def editable?
|
|
total_votes <= Setting['max_votes_for_debate_edit'].to_i
|
|
end
|
|
|
|
def editable_by?(user)
|
|
editable? && author == user
|
|
end
|
|
|
|
def register_vote(user, vote_value)
|
|
if votable_by?(user)
|
|
Debate.increment_counter(:cached_anonymous_votes_total, id) if (user.unverified? && !user.voted_for?(self))
|
|
vote_by(voter: user, vote: vote_value)
|
|
end
|
|
end
|
|
|
|
def votable_by?(user)
|
|
return false unless user
|
|
total_votes <= 100 ||
|
|
!user.unverified? ||
|
|
Setting['max_ratio_anon_votes_on_debates'].to_i == 100 ||
|
|
anonymous_votes_ratio < Setting['max_ratio_anon_votes_on_debates'].to_i ||
|
|
user.voted_for?(self)
|
|
end
|
|
|
|
def anonymous_votes_ratio
|
|
return 0 if cached_votes_total == 0
|
|
(cached_anonymous_votes_total.to_f / cached_votes_total) * 100
|
|
end
|
|
|
|
def after_commented
|
|
save # updates the hot_score because there is a before_save
|
|
end
|
|
|
|
def calculate_hot_score
|
|
self.hot_score = ScoreCalculator.hot_score(created_at,
|
|
cached_votes_total,
|
|
cached_votes_up,
|
|
comments_count)
|
|
end
|
|
|
|
def calculate_confidence_score
|
|
self.confidence_score = ScoreCalculator.confidence_score(cached_votes_total,
|
|
cached_votes_up)
|
|
end
|
|
|
|
def after_hide
|
|
self.tags.each{ |t| t.decrement_custom_counter_for('Debate') }
|
|
end
|
|
|
|
def after_restore
|
|
self.tags.each{ |t| t.increment_custom_counter_for('Debate') }
|
|
end
|
|
|
|
def featured?
|
|
self.featured_at.present?
|
|
end
|
|
|
|
end
|