tag.rb
上传用户:netsea168
上传日期:2022-07-22
资源大小:4652k
文件大小:3k
源码类别:

Ajax

开发平台:

Others

  1. class Tag < ActiveRecord::Base
  2.   has_and_belongs_to_many :articles, :order => 'created_at DESC'
  3.   validates_uniqueness_of :name
  4.   attr_reader :description
  5.   attr_reader :keywords
  6.   def self.get(name)
  7.     tagname = name.tr(' ', '').downcase
  8.     tag = find_by_name_or_display_name(tagname, name)
  9.     if tag.nil?
  10.       tag = Tag.create(:name => tagname, :display_name => name)
  11.     end
  12.     tag
  13.   end
  14.   def self.find_by_name_or_display_name(tagname, name)
  15.     self.find(:first, :conditions => [%{name = ? OR display_name = ? OR display_name = ?}, tagname, tagname, name])
  16.   end
  17.   def self.find_by_name(name, *args)
  18.     self.send(:method_missing, :find_by_name, name, *args) ||
  19.       self.new(:name => name)
  20.   end
  21.   def ensure_naming_conventions
  22.     if self.display_name.blank?
  23.       self.display_name = self.name
  24.     end
  25.     self.name = self.name.gsub('.', '-')
  26.     self.name = self.name.gsub(' ', '').downcase
  27.   end
  28.   before_save :ensure_naming_conventions
  29.   def self.find_all_with_article_counters(limit=20, orderby='article_counter DESC', start=0)
  30.     # Only count published articles
  31.     self.find_by_sql([%{
  32.       SELECT tags.id, tags.name, tags.display_name, COUNT(articles_tags.article_id) AS article_counter
  33.       FROM #{Tag.table_name} tags LEFT OUTER JOIN #{Tag.table_name_prefix}articles_tags#{Tag.table_name_suffix} articles_tags
  34.         ON articles_tags.tag_id = tags.id
  35.       LEFT OUTER JOIN #{Tag.table_name_prefix + Article.table_name + Tag.table_name_prefix} articles
  36.         ON articles_tags.article_id = articles.id
  37.       WHERE articles.published = ?
  38.       GROUP BY tags.id, tags.name, tags.display_name
  39.       ORDER BY #{orderby}
  40.       LIMIT ? OFFSET ?
  41.       },true, limit, start]).each{|item| item.article_counter = item.article_counter.to_i }
  42.   end
  43.   def self.merge(from, to)
  44.     self.update_by_sql([%{UPDATE article_tags SET tag_id = #{to} WHERE tag_id = #{from} }])
  45.   end
  46.   def self.find_by_permalink(*args)
  47.     self.find_by_name(*args) || new(:name => args.first)
  48.   end
  49.   def self.to_prefix
  50.     'tag'
  51.   end
  52.   # Return all tags with the char or string
  53.   # send by parameter
  54.   def self.find_with_char(char)
  55.     find :all, :conditions => ['name LIKE ? ', "%#{char}%"], :order => 'name ASC'
  56.   end
  57.   def published_articles
  58.     articles.already_published
  59.   end
  60.   def permalink
  61.     self.name
  62.   end
  63.   def permalink_url(anchor=nil, only_path=true)
  64.     blog = Blog.default # remove me...
  65.     blog.url_for(
  66.       :controller => 'tags',
  67.       :action => 'show',
  68.       :id => permalink
  69.     )
  70.   end
  71.   def to_atom(xml)
  72.     xml.category :term => display_name, :scheme => permalink_url
  73.   end
  74.   def to_rss(xml)
  75.     xml.category display_name
  76.   end
  77.   def to_param
  78.     permalink
  79.   end
  80. end