Либо, если вам нужно написать его с нуля, или использовать уже разработанный самоцвет, вам нужно изучить Полиморфные ассоциации
Вы можете изучать либо acts_as_taggable_on , либо acts_as_taggable_on_steroids код.
Это код миграции для activ_as_taggable_on в качестве примера
class ActsAsTaggableOnMigration < ActiveRecord::Migration
def self.up
create_table :tags do |t|
t.column :name, :string
end
create_table :taggings do |t|
t.column :tag_id, :integer
t.column :taggable_id, :integer
t.column :tagger_id, :integer
t.column :tagger_type, :string
# You should make sure that the column created is
# long enough to store the required class names.
t.column :taggable_type, :string
t.column :context, :string
t.column :created_at, :datetime
end
add_index :taggings, :tag_id
add_index :taggings, [:taggable_id, :taggable_type, :context]
end
def self.down
drop_table :taggings
drop_table :tags
end
end