class Topic < ActiveRecord::Base belongs_to :forum, :counter_cache => true belongs_to :user has_many :monitorships has_many :monitors, :through => :monitorships, :conditions => ['monitorships.active = ?', true], :source => :user, :order => 'users.display_name' has_many :posts, :order => 'posts.created_at', :dependent => :destroy do def last @last_post ||= find(:first, :order => 'posts.created_at desc') end end belongs_to :replied_by_user, :foreign_key => "replied_by", :class_name => "User" validates_presence_of :forum, :user, :title validate :title_cannot_contain_blacklisted_strings before_create :set_default_replied_at_and_sticky after_save :set_post_topic_id attr_accessible :title # to help with the create form attr_accessor :body def voices posts.map { |p| p.user_id }.uniq.size end def hit! self.class.increment_counter :hits, id end def sticky?() sticky == 1 end def views() hits end def paged?(per_page = 25) posts_count > per_page.to_i end def last_page(per_page = 25) per_page = per_page.to_f per_page = 25.0 if (per_page < 1) (posts_count.to_f / per_page).ceil.to_i end def editable_by?(user) user && (user.id == user_id || user.admin? || user.moderator_of?(forum_id)) end protected def set_default_replied_at_and_sticky self.replied_at = Time.now.utc self.sticky ||= 0 end def set_post_topic_id Post.update_all ['forum_id = ?', forum_id], ['topic_id = ?', id] end def title_cannot_contain_blacklisted_strings downcase_title = title.downcase rescue '' blacklist = Blacklist.find(:first).title_list rescue '' prohibited = false blacklist.split("\n").each do |item| if downcase_title.include?(item) prohibited = true break end end errors.add(:title, "contains prohibited text") if prohibited == true end end