使用Acts As Taggable On Steroids定义标签

最近下载一个rails blog应用(Simplelog)并把它里面的acts_as_taggable plugin改为Acts As Taggable On Steroids,因为在rails2.0下总是运行出错.
1.安装
Ruby代码
  1. ruby script/plugin install http://svn.viney.net.nz/things/rails/plugins/acts_as_taggable_on_steroids  

2.建立数据
生成migration:
Ruby代码
  1. ruby script/generate acts_as_taggable_migration  

生成数据:
Ruby代码
  1. rake db:migrate  

3.应用:
假如有个Post Model,添加acts_as_taggable到Post里面:
Ruby代码
  1. class Post < ActiveRecord::Base  
  2.   acts_as_taggable  
  3.   ......  
  4. end  

使用acts_as_taggable提供的方法(tag_list, tag_list=):
Ruby代码
  1. p = Post.find(:first)  
  2. p.tag_list # []  
  3. p.tag_list = "hebe, selina"  
  4. p.save  
  5. p.tag_list # ["hebe", "selina"]  

或者:
Ruby代码
  1. p.tag_list.add("selina""hebe")  
  2. p.tag_list.remove("ella")  

4.查找tag对象
Ruby代码
  1. Post.find_tagged_with('Hebe, Selina')  

find_tagged_with默认查找任何给定的标签,如果要查找完全符合指定的标签,可用:
Ruby代码
  1. Post.find_tagged_with('Hebe, Selina':match_all => true)  

5.获取tags
因为我们指定acts_as_taggable到Post mdel,所以可以通过以下语句获取所有的Post标签:
Ruby代码
  1. Post.tag_counts  

如果想指定某个用户的所有Post的所有标签:
Ruby代码
  1. User.find(:first).posts.tag_counts #User与Post已设定关联  

Acts As Taggable On Steroids还提供一个TagsHelper:
首先在ApplicationHelper包含TagsHelper:
Ruby代码
  1. module ApplicationHelper  
  2.   include TagsHelper  
  3. end  

然后是Controller:
Ruby代码
  1. class PostController < ApplicationController  
  2.   def tag_cloud  
  3.     @tags = Post.tag_counts  
  4.   end  
  5. end  

and than View:
Ruby代码
  1. <% tag_cloud @tags, %w(css1 css2 css3 css4) do |tag, css_class| %>  
  2.     <%= link_to tag.name, { :action => :tag:id => tag.name }, :class => css_class %>  
  3.   <% end %>  

6.标签Caching
使用标签caching可以提高请求的执行效率.要使用标签caching,必须增加一个叫cached_tag_list的字段,且默认值是null,而不是空字符.
Ruby代码
  1. class CachePostTagList < ActiveRecord::Migration  
  2.   def self.up  
  3.     add_column :posts:cached_tag_list:string  
  4.   end  
  5. end  
  6.   
  7. class Post < ActiveRecord::Base  
  8.   acts_as_taggable  
  9.   
  10.   # 默认字段名是: cached_tag_list, 不过也可以改变:  
  11.   set_cached_tag_list_column_name "my_caching_column_name"  
  12. end  

注意:如果你建立tag,或者追加tag到关联的Post.那么被caching的标签是不会更新的,
必须调用save_cached_tag_list方法.
posted @ 2009-08-25 16:29  麦飞  阅读(787)  评论(0编辑  收藏  举报