public
Description: something similiar to acts_as_taggable_on_steroids for datamapper
Homepage: http://aaron.aaron033.com
Clone URL: git://github.com/aq1018/dm-is-taggable.git
name age message
file .gitignore Tue Sep 16 02:41:06 -0700 2008 modified Rakefile so it can be built independently [aq1018]
file History.txt Tue Sep 09 00:34:54 -0700 2008 first commit [aq1018]
file LICENSE Tue Sep 16 02:24:45 -0700 2008 add names to license [aq1018]
file Manifest.txt Fri May 08 03:00:34 -0700 2009 Bumped version [genki]
file README.textile Tue Sep 16 02:51:51 -0700 2008 add installation instructions [aq1018]
file README.txt Tue Sep 16 03:12:03 -0700 2008 modified manifest, etc... [aq1018]
file Rakefile Tue Sep 16 03:12:03 -0700 2008 modified manifest, etc... [aq1018]
file TODO Tue Sep 09 00:34:54 -0700 2008 first commit [aq1018]
file dm-is-taggable.gemspec Fri May 08 21:45:43 -0700 2009 Fixed a bug. [genki]
directory lib/ Fri May 08 21:45:43 -0700 2009 Fixed a bug. [genki]
directory spec/ Fri May 08 19:47:26 -0700 2009 Changed the find method to accept options for c... [genki]
directory tasks/ Fri Apr 24 14:30:29 -0700 2009 Added gemspec file [genki]
README.textile

dm-is-taggable

dm-is-taggable is a tagging system built for datamapper. It has supports for multiple tagger types and taggable types.
Each tagger can tag different taggable objects.

Installation

Download the plugin

In your console:


git clone git://github.com/aq1018/dm-is-taggable.git

Install the gem

In your console:


cd dm-is-taggable
sudo rake install

Include it Merb

In merb init.rb:


dependency "dm-is-taggable"

Using dm-is-taggable in your code

Define taggers


  class User
    include DataMapper::Resource
    property :id, Serial
    property :name, String
    is :tagger, :on => ["Article", "Picture"]
  end

  class Bot
    include DataMapper::Resource
    property :id, Serial
    property :name, String
    is :tagger, :on => ["Article", "Picture"]
  end

Define taggables


  class Article
    include DataMapper::Resource
    property :id, Serial
    is :taggable, :by => ["User", "Bot"]
  end

  class Picture
    include DataMapper::Resource
    property :id, Serial
    is :taggable, :by => ["User", "Bot"]
  end

Create tags


  
  @picture = Picture.first
  @scott = User.first
  
  # You can tag like this
  @picture.tag(:with => "shanghai, bar, beer", :by => @scott)
  
  # or like this
  # Note: this doesn't remove the previous tags
  Tag.as(@scott) do
    @picture.tag(:with => "cool, tag1, tag2")
  end
  
  # or like this
  # Note, this removes all previous tags
  Tag.as(@scott) do
    @picture.taglist("cool, tag1, tag2")
  end

Retrieve objects with tags


  
  # find pictures tagged with tag1 and tag2
  Picture.find(:with => "tag1, tag2")
  
  # find pictures tagged with tag1 or tag2
  Picture.find(:with => "tag1, tag2", :match => :any)
  
  # find pictures tagged with tag1 or tag2, tagged by @user1
  Picture.find(:with => "tag1, tag2", :match => :any, :by => @user1)
  
  # find pictures tagged with tag1 or tag2, tagged by all users
  Picture.find(:with => "tag1, tag2", :match => :any, :by => User)
  
  # or you can do scoped way
  
  # find pictures tagged with tag1 or tag2, tagged by all users
  Tag.as(User) do
    Picture.find(:with => "tag1, tag2", :match => :any)
  end
  
  # find pictures tagged with tag1 or tag2, tagged by @user1
  Tag.as(@user1) do
    Picture.find(:with => "tag1, tag2", :match => :any)
  end
  
    
  # You can tag like this
  @picture.tag(:with => "shanghai, bar, beer", :by => @scott)
  
  # or like this
  # Note: this doesn't remove the previous tags
  Tag.as(@scott) do
    @picture.tag(:with => "cool, tag1, tag2")
  end
  
  # or like this
  # Note, this removes all previous tags
  Tag.as(@scott) do
    @picture.taglist("cool, tag1, tag2")
  end

Retrieve tags with objects


  
  @picture1 = Picture.first
  
  # get all tags associated with @picture2 as a string
  @picture1.taglist
  
  # or as tag objects
  @picture1.tags
  
  # tags tagged by users
  @picture1.tags_by_users
  
  # find tags by all users
  Tag.by(User)

  # find tags by a user
  Tag.by(@user)

  # find tags on all pictures
  Tag.on(Picture)
  
  # find tags on a picture
  Tag.on(@picture1)
  
  # find tags by a user, on all pictures
  Tag.by(@user).on(Pictures)
  
  # find tags by all users on a picture
  Tag.by(User).on(@picture)
  
  # find tags by a user on a picture
  Tag.by(@user).on(@picture)
  

Counting tags


  
  # Count how many articles are tagged by @user1
  Tag.tagged_count(:by => @user1, :on => Article)
  
  # Count how many articles are tagged by @user1 with "tag1"
  Tag.tagged_count(:by => @user1, :on => Article, :with => "tag1")