require 'sunspot' require 'sunspot/rails' class Article < ActiveRecord::Base cattr_reader :per_page @@per_page = 10 before_validation :remove_illegal_characters belongs_to :infosource has_many :article_statuses has_many :was_sent_to, :through => :article_statuses, :source => :user, :conditions => "status = '#{ArticleStatus::STATUS_SENT}'", :order => :created_at has_many :viewed_by, :through => :article_statuses, :source => :user, :conditions => "status ='#{ArticleStatus::STATUS_VIEWED}'", :order => :created_at searchable do string :author text :title text :summary text :body string :url time :published_at dynamic_boolean :status do article_statuses.inject({}) do |user_statuses_hash, article_status| user_status_symbol = Article.give_user_status_symbol(article_status.user, article_status.status) user_statuses_hash.merge(user_status_symbol => true) end end end validates_format_of :url, :with => URI::regexp(%w(http https)), :allow_nil => true validates_uniqueness_of :guid, :allow_nil => true def self.give_user_status_symbol(user, status) "user#{user[:id]}_status#{status}".to_sym end def size title.size + summary.size + body.size + url.size end def set_user_status(user, status) article_status = ArticleStatus.find_by_user_id_and_article_id_and_status(user, self, status) if article_status.nil? article_status = ArticleStatus.new article_status.user = user article_status.article = self article_status.status = status article_status.save! end self.touch end def remove_illegal_characters ugly_characters = "\x00-\x1F" exchange_character = ' ' author.tr!(ugly_characters, exchange_character) unless author.nil? title.tr!(ugly_characters, exchange_character) unless title.nil? summary.tr!(ugly_characters, exchange_character) unless summary.nil? body.tr!(ugly_characters, exchange_character) unless body.nil? url.tr!(ugly_characters, '') unless url.nil? end end