欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

每天一剂Rails良药之Tagging 博客分类: Ruby RailsActiveRecordSocialRubyUP 

程序员文章站 2024-03-05 08:52:00
...
“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