“social networking”产生了一个东西叫“tagging”,而DHH为Rails写了一个acts_as_taggable插件,简化了Rails开发tagging功能
acts_as_taggable依赖于Rails的polymorphic associations feature,允许对任何model进行tag
1,安装插件
ruby script/plugin install legacy
2,建立数据库表
由于model和tag是Many-to-Many的关系,我们需要建立如下migration
class AddDatabaseStructureForTagging < ActiveRecord::Migration
def self.up
create_table :tags do |t|
t.column :name, :string
end
create_table :taggings do |t|
t.column :taggable_id, :integer
t.column :tag_id, :integer
t.column :taggable_type, :string
end
end
def self.down
drop_table :tags
drop_table :taggings
end
其中taggings表为关系表,为model(taggable)和tag建立多对多关联
3,例子
class Contact < ActiveRecord::Base
acts_as_taggable
end
在model类定义里加上acts_as_taggable即可让该model具有tagging的功能
class ContactsController < ApplicationController
def list
@contacts = if tag_name = params[:id]
Tag.find_by_name(tag_name).tagged
else
Contact.find(:all)
end
def tag
contact = Contact.find(params[:id])
contact.tag_with(params[:tag_list])
contact.save
end
end
Tag.find_by_name(tag_name).tagged即可得到name为tag_name的Tag的contacts(如果对多个model进行tagging,可能要对taggings表的taggable_type进行查询)
contact.tag_with(params[:tag_list])则用以空格分隔的tag名列表来对该contact对象进行tagging,如果tags表没有某tag,则new一个该tag