tag.rb
上传用户:netsea168
上传日期:2022-07-22
资源大小:4652k
文件大小:3k
- class Tag < ActiveRecord::Base
- has_and_belongs_to_many :articles, :order => 'created_at DESC'
- validates_uniqueness_of :name
- attr_reader :description
- attr_reader :keywords
- def self.get(name)
- tagname = name.tr(' ', '').downcase
- tag = find_by_name_or_display_name(tagname, name)
- if tag.nil?
- tag = Tag.create(:name => tagname, :display_name => name)
- end
- tag
- end
- def self.find_by_name_or_display_name(tagname, name)
- self.find(:first, :conditions => [%{name = ? OR display_name = ? OR display_name = ?}, tagname, tagname, name])
- end
- def self.find_by_name(name, *args)
- self.send(:method_missing, :find_by_name, name, *args) ||
- self.new(:name => name)
- end
- def ensure_naming_conventions
- if self.display_name.blank?
- self.display_name = self.name
- end
- self.name = self.name.gsub('.', '-')
- self.name = self.name.gsub(' ', '').downcase
- end
- before_save :ensure_naming_conventions
- def self.find_all_with_article_counters(limit=20, orderby='article_counter DESC', start=0)
- # Only count published articles
- self.find_by_sql([%{
- SELECT tags.id, tags.name, tags.display_name, COUNT(articles_tags.article_id) AS article_counter
- FROM #{Tag.table_name} tags LEFT OUTER JOIN #{Tag.table_name_prefix}articles_tags#{Tag.table_name_suffix} articles_tags
- ON articles_tags.tag_id = tags.id
- LEFT OUTER JOIN #{Tag.table_name_prefix + Article.table_name + Tag.table_name_prefix} articles
- ON articles_tags.article_id = articles.id
- WHERE articles.published = ?
- GROUP BY tags.id, tags.name, tags.display_name
- ORDER BY #{orderby}
- LIMIT ? OFFSET ?
- },true, limit, start]).each{|item| item.article_counter = item.article_counter.to_i }
- end
- def self.merge(from, to)
- self.update_by_sql([%{UPDATE article_tags SET tag_id = #{to} WHERE tag_id = #{from} }])
- end
- def self.find_by_permalink(*args)
- self.find_by_name(*args) || new(:name => args.first)
- end
- def self.to_prefix
- 'tag'
- end
- # Return all tags with the char or string
- # send by parameter
- def self.find_with_char(char)
- find :all, :conditions => ['name LIKE ? ', "%#{char}%"], :order => 'name ASC'
- end
- def published_articles
- articles.already_published
- end
- def permalink
- self.name
- end
- def permalink_url(anchor=nil, only_path=true)
- blog = Blog.default # remove me...
- blog.url_for(
- :controller => 'tags',
- :action => 'show',
- :id => permalink
- )
- end
- def to_atom(xml)
- xml.category :term => display_name, :scheme => permalink_url
- end
- def to_rss(xml)
- xml.category display_name
- end
- def to_param
- permalink
- end
- end