每天一剂Rails良药之Tagging

“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

你可能感兴趣的:(Ruby,UP,Rails,ActiveRecord,Social)