From 2638ef4711bf7597c7bb64359437d6e67045404a Mon Sep 17 00:00:00 2001 From: jonathan Date: Thu, 12 Oct 2006 11:10:25 +0000 Subject: [PATCH] git-svn-id: http://svn.viney.net.nz/things/rails/plugins/acts_as_taggable_on_steroids@130 20afb1e0-9c0e-0410-9884-91ed27886737 --- MIT-LICENSE | 20 + README | 60 ++ Rakefile | 22 + init.rb | 4 + lib/acts_as_taggable.rb | 134 +++ lib/tag.rb | 39 + lib/tag_counts_extension.rb | 17 + lib/tagging.rb | 4 + test/abstract_unit.rb | 67 ++ test/acts_as_taggable_test.rb | 144 +++ test/database.yml | 6 + test/debug.log | 1647 +++++++++++++++++++++++++++++++++ test/fixtures/photo.rb | 8 + test/fixtures/photos.yml | 24 + test/fixtures/post.rb | 7 + test/fixtures/posts.yml | 24 + test/fixtures/taggings.yml | 126 +++ test/fixtures/tags.yml | 19 + test/fixtures/user.rb | 4 + test/fixtures/users.yml | 7 + test/schema.rb | 26 + test/tag_test.rb | 74 ++ test/tagging_test.rb | 9 + 23 files changed, 2492 insertions(+) create mode 100644 MIT-LICENSE create mode 100644 README create mode 100644 Rakefile create mode 100644 init.rb create mode 100644 lib/acts_as_taggable.rb create mode 100644 lib/tag.rb create mode 100644 lib/tag_counts_extension.rb create mode 100644 lib/tagging.rb create mode 100644 test/abstract_unit.rb create mode 100644 test/acts_as_taggable_test.rb create mode 100644 test/database.yml create mode 100644 test/debug.log create mode 100644 test/fixtures/photo.rb create mode 100644 test/fixtures/photos.yml create mode 100644 test/fixtures/post.rb create mode 100644 test/fixtures/posts.yml create mode 100644 test/fixtures/taggings.yml create mode 100644 test/fixtures/tags.yml create mode 100644 test/fixtures/user.rb create mode 100644 test/fixtures/users.yml create mode 100644 test/schema.rb create mode 100644 test/tag_test.rb create mode 100644 test/tagging_test.rb diff --git a/MIT-LICENSE b/MIT-LICENSE new file mode 100644 index 0000000..602bda2 --- /dev/null +++ b/MIT-LICENSE @@ -0,0 +1,20 @@ +Copyright (c) 2006 Jonathan Viney + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/README b/README new file mode 100644 index 0000000..93b007e --- /dev/null +++ b/README @@ -0,0 +1,60 @@ += acts_as_taggable_on_steroids + +This plugin is based on acts_as_taggable by DHH but includes extras +such as tests, smarter tag assignment, and tag cloud calculations. + +Thanks to www.fanacious.com for allowing this plugin to be released. Please check out +their site to show your support. + +== Resources + +Install + * script/plugin install http://svn.viney.net.nz/things/rails/plugins/acts_as_taggable_on_steroids + +== Usage + +=== Basic tagging + +Using the examples from the tests, let's suppose we have users that have many posts and we want those +posts to be able to be tagged by the user. + +As usual, we add +acts_as_taggable+ to the Post class: + + class Post < ActiveRecord::Base + acts_as_taggable + + belongs_to :user + end + +We can now use the tagging methods provided by acts_as_taggable, tag_list and tag_list=. Both these +methods work like regular attribute accessors. + + p = Post.find(:first) + p.tag_list # "" + p.tag_list = "Funny, Silly" + p.save + p.reload.tag_list # "Funny, Silly" + +=== Tag cloud calculations + +To construct tag clouds, the frequency of each tag needs to be calculated. +Because we specified +acts_as_taggable+ on the Post class, we can +get a calculation of all the tag counts by using Post.tag_counts. But what if we wanted a tag count for +an individual user's posts? To achieve this we extend the :posts association like so: + + class User < ActiveRecord::Base + has_many :posts, :extend => TagCountsExtension + end + +This extension now allows us to do the following: + + User.find(:first).posts.tag_counts + +This can be used to construct a tag cloud for the posts of an individual user. The +TagCountsExtension+ should +only be used on associations that have +acts_as_taggable+ defined. + +Problems, comments, and suggestions all welcome. jonathan.viney@gmail.com + +== Credits + +www.fanacious.com diff --git a/Rakefile b/Rakefile new file mode 100644 index 0000000..d2c0003 --- /dev/null +++ b/Rakefile @@ -0,0 +1,22 @@ +require 'rake' +require 'rake/testtask' +require 'rake/rdoctask' + +desc 'Default: run unit tests.' +task :default => :test + +desc 'Test the acts_as_taggable_on_steroids plugin.' +Rake::TestTask.new(:test) do |t| + t.libs << 'lib' + t.pattern = 'test/**/*_test.rb' + t.verbose = true +end + +desc 'Generate documentation for the acts_as_taggable_on_steroids plugin.' +Rake::RDocTask.new(:rdoc) do |rdoc| + rdoc.rdoc_dir = 'rdoc' + rdoc.title = 'Acts As Taggable On Steroids' + rdoc.options << '--line-numbers' << '--inline-source' + rdoc.rdoc_files.include('README') + rdoc.rdoc_files.include('lib/**/*.rb') +end diff --git a/init.rb b/init.rb new file mode 100644 index 0000000..5d3aa8e --- /dev/null +++ b/init.rb @@ -0,0 +1,4 @@ +require File.dirname(__FILE__) + '/lib/acts_as_taggable' + +require File.dirname(__FILE__) + '/lib/tagging' +require File.dirname(__FILE__) + '/lib/tag' diff --git a/lib/acts_as_taggable.rb b/lib/acts_as_taggable.rb new file mode 100644 index 0000000..9aea554 --- /dev/null +++ b/lib/acts_as_taggable.rb @@ -0,0 +1,134 @@ +module ActiveRecord + module Acts #:nodoc: + module Taggable #:nodoc: + def self.included(base) + base.extend(ClassMethods) + end + + module ClassMethods + def acts_as_taggable(options = {}) + has_many :taggings, :as => :taggable, :dependent => :destroy, :include => :tag + has_many :tags, :through => :taggings + + after_save :save_tags + + include ActiveRecord::Acts::Taggable::InstanceMethods + extend ActiveRecord::Acts::Taggable::SingletonMethods + + alias_method :reload_without_tag_list, :reload + alias_method :reload, :reload_with_tag_list + end + end + + module SingletonMethods + # Pass either a tag string, or an array of strings or tags + def find_tagged_with(tags, options = {}) + tags = Tag.parse(tags) if tags.is_a?(String) + return [] if tags.empty? + tags.map!(&:to_s) + + conditions = sanitize_sql(['tags.name in (?)', tags]) + conditions << "and #{sanitize_sql(options.delete(:conditions))}" if options[:conditions] + + find(:all, { :select => "DISTINCT #{table_name}.*", + :joins => "left outer join taggings on taggings.taggable_id = #{table_name}.#{primary_key} and taggings.taggable_type = '#{name}' " + + "left outer join tags on tags.id = taggings.tag_id", + :conditions => conditions }.merge(options)) + end + + # Options: + # :start_at - Restrict the tags to those created after a certain time + # :end_at - Restrict the tags to those created before a certain time + # :conditions - A piece of SQL conditions to add to the query + # :limit - The maximum number of tags to return + # :order - A piece of SQL to order by. Eg 'tags.count desc' or 'taggings.created_at desc' + # :at_least - Exclude tags with a frequency less than the given value + # :at_most - Exclude tags with a frequency greater then the given value + def tag_counts(options = {}) + options.assert_valid_keys :start_at, :end_at, :conditions, :at_least, :at_most, :order, :limit + + start_at = sanitize_sql(['taggings.created_at >= ?', options[:start_at]]) if options[:start_at] + end_at = sanitize_sql(['taggings.created_at <= ?', options[:end_at]]) if options[:end_at] + options[:conditions] = sanitize_sql(options[:conditions]) if options[:conditions] + + conditions = [options[:conditions], start_at, end_at].compact.join(' and ') + + at_least = sanitize_sql(['count >= ?', options[:at_least]]) if options[:at_least] + at_most = sanitize_sql(['count <= ?', options[:at_most]]) if options[:at_most] + having = [at_least, at_most].compact.join(' and ') + + order = "order by #{options[:order]}" if options[:order] + limit = sanitize_sql(['limit ?', options[:limit]]) if options[:limit] + + Tag.find_by_sql <<-END + select tags.id, tags.name, count(*) as count + from tags left outer join taggings on tags.id = taggings.tag_id + left outer join #{table_name} on #{table_name}.id = taggings.taggable_id + where taggings.taggable_type = "#{name}" + #{"and #{conditions}" unless conditions.blank?} + group by tags.id + having count(*) > 0 #{"and #{having}" unless having.blank?} + #{order} + #{limit} + END + end + end + + module InstanceMethods + attr_writer :tag_list + + def tag_list + defined?(@tag_list) ? @tag_list : read_tags + end + + def save_tags + if defined?(@tag_list) + write_tags(@tag_list) + remove_tag_list + end + end + + def write_tags(list) + new_tag_names = Tag.parse(list) + old_tagging_ids = [] + + Tag.transaction do + taggings.each do |tagging| + index = new_tag_names.index(tagging.tag.name) + index ? new_tag_names.delete_at(index) : old_tagging_ids << tagging.id + end + + Tagging.delete_all(['id in (?)', old_tagging_ids]) unless old_tagging_ids.empty? + + # Create any new tags/taggings + new_tag_names.each do |name| + Tag.find_or_create_by_name(name).tag(self) + end + + taggings.reset + tags.reset + end + true + end + + def read_tags + tags.collect do |tag| + tag.name.include?(',') ? "\"#{tag.name}\"" : tag.name + end.join(', ') + end + + def reload_with_tag_list(*args) + remove_tag_list + reload_without_tag_list(*args) + end + + private + def remove_tag_list + remove_instance_variable(:@tag_list) if defined?(@tag_list) + end + end + end + end +end + +ActiveRecord::Base.send(:include, ActiveRecord::Acts::Taggable) diff --git a/lib/tag.rb b/lib/tag.rb new file mode 100644 index 0000000..189c8b7 --- /dev/null +++ b/lib/tag.rb @@ -0,0 +1,39 @@ +class Tag < ActiveRecord::Base + has_many :taggings + + def self.parse(list) + tags = [] + + return tags if list.blank? + list = list.dup + + # Parse the quoted tags + list.gsub!(/"(.*?)"\s*,?\s*/) { tags << $1; "" } + + # Strip whitespace and remove blank tags + (tags + list.split(',')).map!(&:strip).delete_if(&:blank?) + end + + # A list of all the objects tagged with this tag + def tagged + taggings.collect(&:taggable) + end + + # Tag a taggable with this tag + def tag(taggable) + Tagging.create :tag_id => id, :taggable => taggable + taggings.reset + end + + def ==(object) + super || (object.is_a?(Tag) && name == object.name) + end + + def to_s + name + end + + def count + @attributes['count'].to_i if @attributes.include?('count') + end +end diff --git a/lib/tag_counts_extension.rb b/lib/tag_counts_extension.rb new file mode 100644 index 0000000..cd04a4b --- /dev/null +++ b/lib/tag_counts_extension.rb @@ -0,0 +1,17 @@ +module TagCountsExtension + # Options will be passed to the tag_counts method on the association's class + def tag_counts(options = {}) + load_target + return [] if target.blank? + + key_condition = "#{@reflection.table_name}.#{@reflection.primary_key_name} = #{target.first.send(@reflection.primary_key_name)}" + + options[:conditions] = if options[:conditions] + sanitize_sql(options[:conditions]) + " and #{key_condition}" + else + key_condition + end + + @reflection.klass.tag_counts(options) + end +end diff --git a/lib/tagging.rb b/lib/tagging.rb new file mode 100644 index 0000000..33daf86 --- /dev/null +++ b/lib/tagging.rb @@ -0,0 +1,4 @@ +class Tagging < ActiveRecord::Base + belongs_to :tag + belongs_to :taggable, :polymorphic => true +end diff --git a/test/abstract_unit.rb b/test/abstract_unit.rb new file mode 100644 index 0000000..46cb730 --- /dev/null +++ b/test/abstract_unit.rb @@ -0,0 +1,67 @@ +require 'test/unit' + +begin + require File.dirname(__FILE__) + '/../../../../config/boot' + require 'active_record' +rescue LoadError + require 'rubygems' + require_gem 'activerecord' +end + +require 'active_record/fixtures' + +require File.dirname(__FILE__) + '/../lib/acts_as_taggable' +require File.dirname(__FILE__) + '/../lib/tag' +require File.dirname(__FILE__) + '/../lib/tagging' +require File.dirname(__FILE__) + '/../lib/tag_counts_extension' + +config = YAML::load(IO.read(File.dirname(__FILE__) + '/database.yml')) +ActiveRecord::Base.logger = Logger.new(File.dirname(__FILE__) + '/debug.log') +ActiveRecord::Base.establish_connection(config[ENV['DB'] || 'mysql']) + +load(File.dirname(__FILE__) + '/schema.rb') + +Test::Unit::TestCase.fixture_path = File.dirname(__FILE__) + '/fixtures/' +$LOAD_PATH.unshift(Test::Unit::TestCase.fixture_path) + +class Test::Unit::TestCase #:nodoc: + def create_fixtures(*table_names) + if block_given? + Fixtures.create_fixtures(Test::Unit::TestCase.fixture_path, table_names) { yield } + else + Fixtures.create_fixtures(Test::Unit::TestCase.fixture_path, table_names) + end + end + + # Turn off transactional fixtures if you're working with MyISAM tables in MySQL + self.use_transactional_fixtures = true + + # Instantiated fixtures are slow, but give you @david where you otherwise would need people(:david) + self.use_instantiated_fixtures = false + + def assert_equivalent(expected, actual, message = nil) + if expected.first.is_a?(ActiveRecord::Base) + assert_equal expected.sort_by(&:id), actual.sort_by(&:id), message + else + assert_equal expected.sort, actual.sort, message + end + end + + def assert_tag_counts(tags, expected_values) + # Map the tag fixture names to real tag names + expected_values = expected_values.inject({}) do |hash, (tag, count)| + hash[tags(tag).name] = count + hash + end + + tags.each do |tag| + value = expected_values.delete(tag.name) + assert_not_nil value, "Expected count for #{tag.name} was not provided" if value.nil? + assert_equal value, tag.count, "Expected value of #{value} for #{tag.name}, but was #{tag.count}" + end + + unless expected_values.empty? + assert false, "The following tag counts were not present: #{expected_values.inspect}" + end + end +end diff --git a/test/acts_as_taggable_test.rb b/test/acts_as_taggable_test.rb new file mode 100644 index 0000000..2dd8b77 --- /dev/null +++ b/test/acts_as_taggable_test.rb @@ -0,0 +1,144 @@ +require File.dirname(__FILE__) + '/abstract_unit' + +class ActsAsTaggableOnSteroidsTest < Test::Unit::TestCase + fixtures :tags, :taggings, :posts, :users, :photos + + def test_find_tagged_with + assert_equivalent [posts(:jonathan_sky), posts(:sam_flowers)], Post.find_tagged_with('"Very good"') + assert_equal Post.find_tagged_with('"Very good"'), Post.find_tagged_with(['Very good']) + assert_equal Post.find_tagged_with('"Very good"'), Post.find_tagged_with([tags(:good)]) + + assert_equivalent [photos(:jonathan_dog), photos(:sam_flower), photos(:sam_sky)], Photo.find_tagged_with('Nature') + assert_equal Photo.find_tagged_with('Nature'), Photo.find_tagged_with(['Nature']) + assert_equal Photo.find_tagged_with('Nature'), Photo.find_tagged_with([tags(:nature)]) + + assert_equivalent [photos(:jonathan_bad_cat), photos(:jonathan_dog), photos(:jonathan_questioning_dog)], Photo.find_tagged_with('"Crazy animal" Bad') + assert_equal Photo.find_tagged_with('"Crazy animal" Bad'), Photo.find_tagged_with(['Crazy animal', 'Bad']) + assert_equal Photo.find_tagged_with('"Crazy animal" Bad'), Photo.find_tagged_with([tags(:animal), tags(:bad)]) + end + + def test_find_tagged_with_nonexistant_tags + assert_equal [], Post.find_tagged_with('ABCDEFG') + assert_equal [], Photo.find_tagged_with(['HIJKLM']) + assert_equal [], Photo.find_tagged_with([Tag.new(:name => 'unsaved tag')]) + end + + def test_basic_tag_counts_on_class + assert_tag_counts Post.tag_counts, :good => 2, :nature => 5, :question => 1, :bad => 1 + assert_tag_counts Photo.tag_counts, :good => 1, :nature => 3, :question => 1, :bad => 1, :animal => 3 + end + + def test_tag_counts_on_class_with_date_conditions + assert_tag_counts Post.tag_counts(:start_at => Date.new(2006, 8, 4)), :good => 1, :nature => 3, :question => 1, :bad => 1 + assert_tag_counts Post.tag_counts(:end_at => Date.new(2006, 8, 6)), :good => 1, :nature => 4, :question => 1 + assert_tag_counts Post.tag_counts(:start_at => Date.new(2006, 8, 5), :end_at => Date.new(2006, 8, 8)), :good => 1, :nature => 2, :bad => 1 + + assert_tag_counts Photo.tag_counts(:start_at => Date.new(2006, 8, 12), :end_at => Date.new(2006, 8, 17)), :good => 1, :nature => 1, :bad => 1, :question => 1, :animal => 2 + end + + def test_tag_counts_on_class_with_frequencies + assert_tag_counts Photo.tag_counts(:at_least => 2), :nature => 3, :animal => 3 + assert_tag_counts Photo.tag_counts(:at_most => 2), :good => 1, :question => 1, :bad => 1 + end + + def test_tag_counts_with_limit + assert_equal 2, Photo.tag_counts(:limit => 2).size + assert_equal 1, Post.tag_counts(:at_least => 4, :limit => 2).size + end + + def test_tag_counts_with_limit_and_order + assert_equal [tags(:nature), tags(:good)], Post.tag_counts(:order => 'count desc', :limit => 2) + end + + def test_tag_counts_extension + assert_tag_counts users(:jonathan).posts.tag_counts, :good => 1, :nature => 3, :question => 1 + assert_tag_counts users(:sam).posts.tag_counts, :good => 1, :nature => 2, :bad => 1 + + assert_tag_counts users(:jonathan).photos.tag_counts, :animal => 3, :nature => 1, :question => 1, :bad => 1 + assert_tag_counts users(:sam).photos.tag_counts, :nature => 2, :good => 1 + end + + def test_tag_counts_extension_with_options + assert_equal [], users(:jonathan).posts.tag_counts(:conditions => '1=0') + assert_tag_counts users(:jonathan).posts.tag_counts(:at_most => 2), :good => 1, :question => 1 + end + + def test_tag_list + assert_equivalent Tag.parse('"Very good", Nature'), Tag.parse(posts(:jonathan_sky).tag_list) + assert_equivalent Tag.parse('Bad, "Crazy animal"'), Tag.parse(photos(:jonathan_bad_cat).tag_list) + end + + def test_reassign_tag_list + assert_equivalent Tag.parse('Nature, Question'), Tag.parse(posts(:jonathan_rain).tag_list) + assert posts(:jonathan_rain).update_attributes(:tag_list => posts(:jonathan_rain).tag_list) + assert_equivalent Tag.parse('Nature, Question'), Tag.parse(posts(:jonathan_rain).tag_list) + end + + def test_assign_new_tags + assert_equivalent Tag.parse('"Very good", Nature'), Tag.parse(posts(:jonathan_sky).tag_list) + assert posts(:jonathan_sky).update_attributes(:tag_list => "#{posts(:jonathan_sky).tag_list}, One, Two") + assert_equivalent Tag.parse('"Very good", Nature, One, Two'), Tag.parse(posts(:jonathan_sky).tag_list) + end + + def test_remove_tag + assert_equivalent Tag.parse('"Very good", Nature'), Tag.parse(posts(:jonathan_sky).tag_list) + assert posts(:jonathan_sky).update_attributes(:tag_list => "Nature") + assert_equivalent Tag.parse('Nature'), Tag.parse(posts(:jonathan_sky).tag_list) + end + + def test_remove_and_add_tag + assert_equivalent Tag.parse('"Very good", Nature'), Tag.parse(posts(:jonathan_sky).tag_list) + assert posts(:jonathan_sky).update_attributes(:tag_list => "Nature, Beautiful") + assert_equivalent Tag.parse('Nature, Beautiful'), Tag.parse(posts(:jonathan_sky).tag_list) + end + + def test_tags_not_saved_if_validation_fails + assert_equivalent Tag.parse('"Very good", Nature'), Tag.parse(posts(:jonathan_sky).tag_list) + assert !posts(:jonathan_sky).update_attributes(:tag_list => "One Two", :text => "") + assert_equivalent Tag.parse('"Very good", Nature'), Tag.parse(Post.find(posts(:jonathan_sky).id).tag_list) + end + + def test_tag_list_accessors_on_new_record + p = Post.new(:text => 'Test') + + assert_equal "", p.tag_list + p.tag_list = "One, Two" + assert_equal "One, Two", p.tag_list + end + + def test_read_tag_list_with_commas + assert_equal "Question, Crazy animal", photos(:jonathan_questioning_dog).tag_list + rescue + assert_equal "Crazy animal, Question", photos(:jonathan_questioning_dog).tag_list + end + + def test_clear_tag_list_with_nil + p = photos(:jonathan_questioning_dog) + + assert !p.tag_list.blank? + assert p.update_attributes(:tag_list => nil) + assert p.tag_list.blank? + + assert p.reload.tag_list.blank? + assert Photo.find(p.id).tag_list.blank? + end + + def test_clear_tag_list_with_string + p = photos(:jonathan_questioning_dog) + + assert !p.tag_list.blank? + assert p.update_attributes(:tag_list => ' ') + assert p.tag_list.blank? + + assert p.reload.tag_list.blank? + assert Photo.find(p.id).tag_list.blank? + end + + def test_tag_list_reset_on_reload + p = photos(:jonathan_questioning_dog) + assert !p.tag_list.blank? + p.tag_list = nil + assert p.tag_list.blank? + assert !p.reload.tag_list.blank? + end +end diff --git a/test/database.yml b/test/database.yml new file mode 100644 index 0000000..de6681e --- /dev/null +++ b/test/database.yml @@ -0,0 +1,6 @@ +mysql: + :adapter: mysql + :host: localhost + :username: rails + :password: + :database: acts_as_taggable_on_steroids_plugin_test diff --git a/test/debug.log b/test/debug.log new file mode 100644 index 0000000..6517a20 --- /dev/null +++ b/test/debug.log @@ -0,0 +1,1647 @@ +# Logfile created on Thu Sep 21 23:30:44 New Zealand Standard Time 2006 by logger.rb/1.5.2.7 + SQL (0.000000) Mysql::Error: Unknown table 'tags': DROP TABLE tags + SQL (0.000000) CREATE TABLE tags (`id` int(11) DEFAULT NULL auto_increment PRIMARY KEY, `name` varchar(255)) ENGINE=InnoDB + SQL (0.000000) Mysql::Error: Unknown table 'taggings': DROP TABLE taggings + SQL (0.000000) CREATE TABLE taggings (`id` int(11) DEFAULT NULL auto_increment PRIMARY KEY, `tag_id` int(11), `taggable_id` int(11), `taggable_type` varchar(255), `created_at` datetime) ENGINE=InnoDB + SQL (0.000000) Mysql::Error: Unknown table 'users': DROP TABLE users + SQL (0.015000) CREATE TABLE users (`id` int(11) DEFAULT NULL auto_increment PRIMARY KEY, `name` varchar(255)) ENGINE=InnoDB + SQL (0.000000) Mysql::Error: Unknown table 'posts': DROP TABLE posts + SQL (0.000000) CREATE TABLE posts (`id` int(11) DEFAULT NULL auto_increment PRIMARY KEY, `text` text, `user_id` int(11)) ENGINE=InnoDB + SQL (0.000000) Mysql::Error: Unknown table 'photos': DROP TABLE photos + SQL (0.000000) CREATE TABLE photos (`id` int(11) DEFAULT NULL auto_increment PRIMARY KEY, `title` varchar(255), `user_id` int(11)) ENGINE=InnoDB + SQL (0.016000) CREATE TABLE schema_info (version int(11)) + SQL (0.000000) INSERT INTO schema_info (version) VALUES(0) + SQL (0.000000) SHOW FIELDS FROM schema_info + SQL (0.000000) UPDATE schema_info SET version = 0 + SQL (0.000000) BEGIN + Post Load (0.000000) SELECT * FROM posts WHERE (posts.id = 1) LIMIT 1 + Post Columns (0.000000) SHOW FIELDS FROM posts + Tag Load (0.000000) SELECT tags.* FROM tags INNER JOIN taggings ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 1 AND taggings.taggable_type = 'Post')  + Tag Columns (0.000000) SHOW FIELDS FROM tags + Post Update (0.000000) UPDATE posts SET `text` = 'The sky is particularly blue today', `user_id` = 1 WHERE id = 1 + Tagging Columns (0.000000) SHOW FIELDS FROM taggings + Tagging Load Including Associations (0.000000) SELECT taggings.`id` AS t0_r0, taggings.`tag_id` AS t0_r1, taggings.`taggable_id` AS t0_r2, taggings.`taggable_type` AS t0_r3, taggings.`created_at` AS t0_r4, tags.`id` AS t1_r0, tags.`name` AS t1_r1 FROM taggings LEFT OUTER JOIN tags ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 1 AND taggings.taggable_type = 'Post')  + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.`name` = 'One' ) LIMIT 1 + SQL (0.000000) INSERT INTO tags (`name`) VALUES('One') + SQL (0.000000) INSERT INTO taggings (`tag_id`, `taggable_type`, `taggable_id`, `created_at`) VALUES(6, 'Post', 1, '2006-09-21 23:32:27') + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.`name` = 'Two' ) LIMIT 1 + SQL (0.000000) INSERT INTO tags (`name`) VALUES('Two') + SQL (0.000000) INSERT INTO taggings (`tag_id`, `taggable_type`, `taggable_id`, `created_at`) VALUES(7, 'Post', 1, '2006-09-21 23:32:27') + Tag Load (0.000000) SELECT tags.* FROM tags INNER JOIN taggings ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 1 AND taggings.taggable_type = 'Post')  + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + Tag Load (0.000000)  select tags.id, tags.name, count(*) as count + from tags left outer join taggings on tags.id = taggings.tag_id + left outer join posts on posts.id = taggings.taggable_id + where taggings.taggable_type = "Post" + + group by tags.id + having count(*) > 0 + + + + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 2) LIMIT 1 + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 4) LIMIT 1 + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 3) LIMIT 1 + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 1) LIMIT 1 + Tag Load (0.000000)  select tags.id, tags.name, count(*) as count + from tags left outer join taggings on tags.id = taggings.tag_id + left outer join photos on photos.id = taggings.taggable_id + where taggings.taggable_type = "Photo" + + group by tags.id + having count(*) > 0 + + + + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 5) LIMIT 1 + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + Photo Load (0.000000) SELECT * FROM photos WHERE (photos.id = 2) LIMIT 1 + Photo Columns (0.000000) SHOW FIELDS FROM photos + Tag Load (0.000000) SELECT tags.* FROM tags INNER JOIN taggings ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 2 AND taggings.taggable_type = 'Photo')  + Photo Update (0.000000) UPDATE photos SET `title` = 'What does this dog want?', `user_id` = 1 WHERE id = 2 + Tagging Load Including Associations (0.000000) SELECT taggings.`id` AS t0_r0, taggings.`tag_id` AS t0_r1, taggings.`taggable_id` AS t0_r2, taggings.`taggable_type` AS t0_r3, taggings.`created_at` AS t0_r4, tags.`id` AS t1_r0, tags.`name` AS t1_r1 FROM taggings LEFT OUTER JOIN tags ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 2 AND taggings.taggable_type = 'Photo')  + Tagging Delete all (0.000000) DELETE FROM taggings WHERE (id in (12,13))  + Tag Load (0.000000) SELECT tags.* FROM tags INNER JOIN taggings ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 2 AND taggings.taggable_type = 'Photo')  + Photo Load (0.000000) SELECT * FROM photos WHERE (photos.id = 2) LIMIT 1 + Tag Load (0.000000) SELECT tags.* FROM tags INNER JOIN taggings ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 2 AND taggings.taggable_type = 'Photo')  + Photo Load (0.000000) SELECT * FROM photos WHERE (photos.id = 2) LIMIT 1 + Tag Load (0.000000) SELECT tags.* FROM tags INNER JOIN taggings ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 2 AND taggings.taggable_type = 'Photo')  + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + Photo Load (0.000000) SELECT * FROM photos WHERE (photos.id = 2) LIMIT 1 + Tag Load (0.000000) SELECT tags.* FROM tags INNER JOIN taggings ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 2 AND taggings.taggable_type = 'Photo')  + Photo Update (0.000000) UPDATE photos SET `title` = 'What does this dog want?', `user_id` = 1 WHERE id = 2 + Tagging Load Including Associations (0.000000) SELECT taggings.`id` AS t0_r0, taggings.`tag_id` AS t0_r1, taggings.`taggable_id` AS t0_r2, taggings.`taggable_type` AS t0_r3, taggings.`created_at` AS t0_r4, tags.`id` AS t1_r0, tags.`name` AS t1_r1 FROM taggings LEFT OUTER JOIN tags ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 2 AND taggings.taggable_type = 'Photo')  + Tagging Delete all (0.000000) DELETE FROM taggings WHERE (id in (12,13))  + Tag Load (0.000000) SELECT tags.* FROM tags INNER JOIN taggings ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 2 AND taggings.taggable_type = 'Photo')  + Photo Load (0.000000) SELECT * FROM photos WHERE (photos.id = 2) LIMIT 1 + Tag Load (0.000000) SELECT tags.* FROM tags INNER JOIN taggings ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 2 AND taggings.taggable_type = 'Photo')  + Photo Load (0.000000) SELECT * FROM photos WHERE (photos.id = 2) LIMIT 1 + Tag Load (0.000000) SELECT tags.* FROM tags INNER JOIN taggings ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 2 AND taggings.taggable_type = 'Photo')  + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + Post Load (0.000000) SELECT * FROM posts WHERE (posts.id = 1) LIMIT 1 + Post Load (0.000000) SELECT * FROM posts WHERE (posts.id = 5) LIMIT 1 + Post Load (0.000000) SELECT DISTINCT posts.* FROM posts left outer join taggings on taggings.taggable_id = posts.id left outer join tags on tags.id = taggings.tag_id WHERE (tags.name in ('Very good'))  + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + Post Load (0.016000) SELECT DISTINCT posts.* FROM posts left outer join taggings on taggings.taggable_id = posts.id left outer join tags on tags.id = taggings.tag_id WHERE (tags.name in ('ABCDEFG'))  + Photo Load (0.000000) SELECT DISTINCT photos.* FROM photos left outer join taggings on taggings.taggable_id = photos.id left outer join tags on tags.id = taggings.tag_id WHERE (tags.name in ('HIJKLM'))  + Photo Load (0.000000) SELECT DISTINCT photos.* FROM photos left outer join taggings on taggings.taggable_id = photos.id left outer join tags on tags.id = taggings.tag_id WHERE (tags.name in ('unsaved tag'))  + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + Photo Load (0.000000) SELECT * FROM photos WHERE (photos.id = 2) LIMIT 1 + Tag Load (0.000000) SELECT tags.* FROM tags INNER JOIN taggings ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 2 AND taggings.taggable_type = 'Photo')  + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + Post Load (0.000000) SELECT * FROM posts WHERE (posts.id = 3) LIMIT 1 + Tag Load (0.000000) SELECT tags.* FROM tags INNER JOIN taggings ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 3 AND taggings.taggable_type = 'Post')  + Post Update (0.000000) UPDATE posts SET `text` = 'Why does the rain fall?', `user_id` = 1 WHERE id = 3 + Tagging Load Including Associations (0.000000) SELECT taggings.`id` AS t0_r0, taggings.`tag_id` AS t0_r1, taggings.`taggable_id` AS t0_r2, taggings.`taggable_type` AS t0_r3, taggings.`created_at` AS t0_r4, tags.`id` AS t1_r0, tags.`name` AS t1_r1 FROM taggings LEFT OUTER JOIN tags ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 3 AND taggings.taggable_type = 'Post')  + Tag Load (0.000000) SELECT tags.* FROM tags INNER JOIN taggings ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 3 AND taggings.taggable_type = 'Post')  + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + Post Load (0.000000) SELECT * FROM posts WHERE (posts.id = 1) LIMIT 1 + Tag Load (0.000000) SELECT tags.* FROM tags INNER JOIN taggings ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 1 AND taggings.taggable_type = 'Post')  + Post Update (0.000000) UPDATE posts SET `text` = 'The sky is particularly blue today', `user_id` = 1 WHERE id = 1 + Tagging Load Including Associations (0.000000) SELECT taggings.`id` AS t0_r0, taggings.`tag_id` AS t0_r1, taggings.`taggable_id` AS t0_r2, taggings.`taggable_type` AS t0_r3, taggings.`created_at` AS t0_r4, tags.`id` AS t1_r0, tags.`name` AS t1_r1 FROM taggings LEFT OUTER JOIN tags ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 1 AND taggings.taggable_type = 'Post')  + Tagging Delete all (0.000000) DELETE FROM taggings WHERE (id in (1))  + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.`name` = 'Beautiful' ) LIMIT 1 + SQL (0.000000) INSERT INTO tags (`name`) VALUES('Beautiful') + SQL (0.000000) INSERT INTO taggings (`tag_id`, `taggable_type`, `taggable_id`, `created_at`) VALUES(8, 'Post', 1, '2006-09-21 23:32:27') + Tag Load (0.000000) SELECT tags.* FROM tags INNER JOIN taggings ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 1 AND taggings.taggable_type = 'Post')  + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + Post Load (0.000000) SELECT * FROM posts WHERE (posts.id = 1) LIMIT 1 + Tag Load (0.000000) SELECT tags.* FROM tags INNER JOIN taggings ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 1 AND taggings.taggable_type = 'Post')  + Post Update (0.000000) UPDATE posts SET `text` = 'The sky is particularly blue today', `user_id` = 1 WHERE id = 1 + Tagging Load Including Associations (0.000000) SELECT taggings.`id` AS t0_r0, taggings.`tag_id` AS t0_r1, taggings.`taggable_id` AS t0_r2, taggings.`taggable_type` AS t0_r3, taggings.`created_at` AS t0_r4, tags.`id` AS t1_r0, tags.`name` AS t1_r1 FROM taggings LEFT OUTER JOIN tags ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 1 AND taggings.taggable_type = 'Post')  + Tagging Delete all (0.000000) DELETE FROM taggings WHERE (id in (1))  + Tag Load (0.000000) SELECT tags.* FROM tags INNER JOIN taggings ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 1 AND taggings.taggable_type = 'Post')  + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + User Load (0.000000) SELECT * FROM users WHERE (users.id = 1) LIMIT 1 + User Columns (0.000000) SHOW FIELDS FROM users + Post Load (0.016000) SELECT * FROM posts WHERE (posts.user_id = 1)  + Tag Load (0.000000)  select tags.id, tags.name, count(*) as count + from tags left outer join taggings on tags.id = taggings.tag_id + left outer join posts on posts.id = taggings.taggable_id + where taggings.taggable_type = "Post" + and posts.user_id = 1 + group by tags.id + having count(*) > 0 + + + + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 4) LIMIT 1 + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 3) LIMIT 1 + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 1) LIMIT 1 + User Load (0.000000) SELECT * FROM users WHERE (users.id = 2) LIMIT 1 + Post Load (0.000000) SELECT * FROM posts WHERE (posts.user_id = 2)  + Tag Load (0.000000)  select tags.id, tags.name, count(*) as count + from tags left outer join taggings on tags.id = taggings.tag_id + left outer join posts on posts.id = taggings.taggable_id + where taggings.taggable_type = "Post" + and posts.user_id = 2 + group by tags.id + having count(*) > 0 + + + + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 2) LIMIT 1 + Photo Load (0.000000) SELECT * FROM photos WHERE (photos.user_id = 1)  + Tag Load (0.000000)  select tags.id, tags.name, count(*) as count + from tags left outer join taggings on tags.id = taggings.tag_id + left outer join photos on photos.id = taggings.taggable_id + where taggings.taggable_type = "Photo" + and photos.user_id = 1 + group by tags.id + having count(*) > 0 + + + + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 5) LIMIT 1 + Photo Load (0.000000) SELECT * FROM photos WHERE (photos.user_id = 2)  + Tag Load (0.000000)  select tags.id, tags.name, count(*) as count + from tags left outer join taggings on tags.id = taggings.tag_id + left outer join photos on photos.id = taggings.taggable_id + where taggings.taggable_type = "Photo" + and photos.user_id = 2 + group by tags.id + having count(*) > 0 + + + + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + User Load (0.000000) SELECT * FROM users WHERE (users.id = 1) LIMIT 1 + Post Load (0.000000) SELECT * FROM posts WHERE (posts.user_id = 1)  + Tag Load (0.000000)  select tags.id, tags.name, count(*) as count + from tags left outer join taggings on tags.id = taggings.tag_id + left outer join posts on posts.id = taggings.taggable_id + where taggings.taggable_type = "Post" + and 1=0 and posts.user_id = 1 + group by tags.id + having count(*) > 0 + + + + Tag Load (0.000000)  select tags.id, tags.name, count(*) as count + from tags left outer join taggings on tags.id = taggings.tag_id + left outer join posts on posts.id = taggings.taggable_id + where taggings.taggable_type = "Post" + and posts.user_id = 1 + group by tags.id + having count(*) > 0 and count <= 2 + + + + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 4) LIMIT 1 + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 1) LIMIT 1 + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + Tag Load (0.000000)  select tags.id, tags.name, count(*) as count + from tags left outer join taggings on tags.id = taggings.tag_id + left outer join posts on posts.id = taggings.taggable_id + where taggings.taggable_type = "Post" + and taggings.created_at >= '2006-08-04' + group by tags.id + having count(*) > 0 + + + + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 2) LIMIT 1 + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 4) LIMIT 1 + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 3) LIMIT 1 + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 1) LIMIT 1 + Tag Load (0.000000)  select tags.id, tags.name, count(*) as count + from tags left outer join taggings on tags.id = taggings.tag_id + left outer join posts on posts.id = taggings.taggable_id + where taggings.taggable_type = "Post" + and taggings.created_at <= '2006-08-06' + group by tags.id + having count(*) > 0 + + + + Tag Load (0.000000)  select tags.id, tags.name, count(*) as count + from tags left outer join taggings on tags.id = taggings.tag_id + left outer join posts on posts.id = taggings.taggable_id + where taggings.taggable_type = "Post" + and taggings.created_at >= '2006-08-05' and taggings.created_at <= '2006-08-08' + group by tags.id + having count(*) > 0 + + + + Tag Load (0.000000)  select tags.id, tags.name, count(*) as count + from tags left outer join taggings on tags.id = taggings.tag_id + left outer join photos on photos.id = taggings.taggable_id + where taggings.taggable_type = "Photo" + and taggings.created_at >= '2006-08-12' and taggings.created_at <= '2006-08-17' + group by tags.id + having count(*) > 0 + + + + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 5) LIMIT 1 + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + Tag Load (0.000000)  select tags.id, tags.name, count(*) as count + from tags left outer join taggings on tags.id = taggings.tag_id + left outer join photos on photos.id = taggings.taggable_id + where taggings.taggable_type = "Photo" + + group by tags.id + having count(*) > 0 and count >= 2 + + + + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 5) LIMIT 1 + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 3) LIMIT 1 + Tag Load (0.000000)  select tags.id, tags.name, count(*) as count + from tags left outer join taggings on tags.id = taggings.tag_id + left outer join photos on photos.id = taggings.taggable_id + where taggings.taggable_type = "Photo" + + group by tags.id + having count(*) > 0 and count <= 2 + + + + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 2) LIMIT 1 + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 4) LIMIT 1 + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 1) LIMIT 1 + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + Tag Load (0.000000)  select tags.id, tags.name, count(*) as count + from tags left outer join taggings on tags.id = taggings.tag_id + left outer join photos on photos.id = taggings.taggable_id + where taggings.taggable_type = "Photo" + + group by tags.id + having count(*) > 0 + + limit 2 + + Tag Load (0.000000)  select tags.id, tags.name, count(*) as count + from tags left outer join taggings on tags.id = taggings.tag_id + left outer join posts on posts.id = taggings.taggable_id + where taggings.taggable_type = "Post" + + group by tags.id + having count(*) > 0 and count >= 4 + + limit 2 + + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 3) LIMIT 1 + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 1) LIMIT 1 + Tag Load (0.000000)  select tags.id, tags.name, count(*) as count + from tags left outer join taggings on tags.id = taggings.tag_id + left outer join posts on posts.id = taggings.taggable_id + where taggings.taggable_type = "Post" + + group by tags.id + having count(*) > 0 + order by count desc + limit 2 + + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + Post Load (0.016000) SELECT * FROM posts WHERE (posts.id = 1) LIMIT 1 + Tag Load (0.000000) SELECT tags.* FROM tags INNER JOIN taggings ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 1 AND taggings.taggable_type = 'Post')  + Photo Load (0.000000) SELECT * FROM photos WHERE (photos.id = 3) LIMIT 1 + Tag Load (0.000000) SELECT tags.* FROM tags INNER JOIN taggings ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 3 AND taggings.taggable_type = 'Photo')  + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + Photo Load (0.000000) SELECT * FROM photos WHERE (photos.id = 2) LIMIT 1 + Tag Load (0.000000) SELECT tags.* FROM tags INNER JOIN taggings ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 2 AND taggings.taggable_type = 'Photo')  + Photo Load (0.000000) SELECT * FROM photos WHERE (photos.id = 2) LIMIT 1 + Tag Load (0.000000) SELECT tags.* FROM tags INNER JOIN taggings ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 2 AND taggings.taggable_type = 'Photo')  + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + Post Load (0.000000) SELECT * FROM posts WHERE (posts.id = 1) LIMIT 1 + Tag Load (0.000000) SELECT tags.* FROM tags INNER JOIN taggings ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 1 AND taggings.taggable_type = 'Post')  + Post Load (0.000000) SELECT * FROM posts WHERE (posts.id = 1) LIMIT 1 + Tag Load (0.000000) SELECT tags.* FROM tags INNER JOIN taggings ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 1 AND taggings.taggable_type = 'Post')  + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 1) LIMIT 1 + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 1) LIMIT 1 + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 1) LIMIT 1 + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 1) LIMIT 1 + Tagging Load (0.000000) SELECT * FROM taggings WHERE (taggings.tag_id = 1)  + Post Load (0.000000) SELECT * FROM posts WHERE (posts.id = 1) LIMIT 1 + Post Load (0.000000) SELECT * FROM posts WHERE (posts.id = 5) LIMIT 1 + Photo Load (0.000000) SELECT * FROM photos WHERE (photos.id = 4) LIMIT 1 + Post Load (0.000000) SELECT * FROM posts WHERE (posts.id = 2) LIMIT 1 + SQL (0.000000) INSERT INTO taggings (`tag_id`, `taggable_type`, `taggable_id`, `created_at`) VALUES(1, 'Post', 2, '2006-09-21 23:32:27') + Tagging Load (0.000000) SELECT * FROM taggings WHERE (taggings.tag_id = 1)  + Post Load (0.000000) SELECT * FROM posts WHERE (posts.id = 1) LIMIT 1 + Post Load (0.000000) SELECT * FROM posts WHERE (posts.id = 5) LIMIT 1 + Photo Load (0.000000) SELECT * FROM photos WHERE (photos.id = 4) LIMIT 1 + Post Load (0.000000) SELECT * FROM posts WHERE (posts.id = 2) LIMIT 1 + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + Post Load (0.000000) SELECT * FROM posts WHERE (posts.id = 1) LIMIT 1 + Post Load (0.000000) SELECT * FROM posts WHERE (posts.id = 5) LIMIT 1 + Photo Load (0.000000) SELECT * FROM photos WHERE (photos.id = 4) LIMIT 1 + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 1) LIMIT 1 + Tagging Load (0.000000) SELECT * FROM taggings WHERE (taggings.tag_id = 1)  + Post Load (0.000000) SELECT * FROM posts WHERE (posts.id = 1) LIMIT 1 + Post Load (0.000000) SELECT * FROM posts WHERE (posts.id = 5) LIMIT 1 + Photo Load (0.000000) SELECT * FROM photos WHERE (photos.id = 4) LIMIT 1 + Post Load (0.000000) SELECT * FROM posts WHERE (posts.id = 4) LIMIT 1 + Photo Load (0.000000) SELECT * FROM photos WHERE (photos.id = 3) LIMIT 1 + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 2) LIMIT 1 + Tagging Load (0.000000) SELECT * FROM taggings WHERE (taggings.tag_id = 2)  + Post Load (0.000000) SELECT * FROM posts WHERE (posts.id = 4) LIMIT 1 + Photo Load (0.000000) SELECT * FROM photos WHERE (photos.id = 3) LIMIT 1 + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + Tagging Load (0.000000) SELECT * FROM taggings WHERE (taggings.id = 1) LIMIT 1 + Tagging Load (0.000000) SELECT * FROM taggings WHERE (taggings.id = 8) LIMIT 1 + Tagging Load (0.000000) SELECT * FROM taggings WHERE (taggings.id = 17) LIMIT 1 + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 1) LIMIT 1 + Tagging Load (0.000000) SELECT * FROM taggings WHERE (taggings.tag_id = 1)  + Tagging Load (0.000000) SELECT * FROM taggings WHERE (taggings.id = 7) LIMIT 1 + Tagging Load (0.000000) SELECT * FROM taggings WHERE (taggings.id = 14) LIMIT 1 + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 2) LIMIT 1 + Tagging Load (0.000000) SELECT * FROM taggings WHERE (taggings.tag_id = 2)  + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 1) LIMIT 1 + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 1) LIMIT 1 + Tagging Load (0.000000) SELECT * FROM taggings WHERE (taggings.id = 1) LIMIT 1 + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 1) LIMIT 1 + SQL (0.000000) ROLLBACK + SQL (0.000000) DROP TABLE tags + SQL (0.000000) CREATE TABLE tags (`id` int(11) DEFAULT NULL auto_increment PRIMARY KEY, `name` varchar(255)) ENGINE=InnoDB + SQL (0.000000) DROP TABLE taggings + SQL (0.016000) CREATE TABLE taggings (`id` int(11) DEFAULT NULL auto_increment PRIMARY KEY, `tag_id` int(11), `taggable_id` int(11), `taggable_type` varchar(255), `created_at` datetime) ENGINE=InnoDB + SQL (0.000000) DROP TABLE users + SQL (0.000000) CREATE TABLE users (`id` int(11) DEFAULT NULL auto_increment PRIMARY KEY, `name` varchar(255)) ENGINE=InnoDB + SQL (0.000000) DROP TABLE posts + SQL (0.015000) CREATE TABLE posts (`id` int(11) DEFAULT NULL auto_increment PRIMARY KEY, `text` text, `user_id` int(11)) ENGINE=InnoDB + SQL (0.000000) DROP TABLE photos + SQL (0.000000) CREATE TABLE photos (`id` int(11) DEFAULT NULL auto_increment PRIMARY KEY, `title` varchar(255), `user_id` int(11)) ENGINE=InnoDB + SQL (0.000000) Mysql::Error: Table 'schema_info' already exists: CREATE TABLE schema_info (version int(11)) + SQL (0.000000) SHOW FIELDS FROM schema_info + SQL (0.000000) UPDATE schema_info SET version = 0 + SQL (0.000000) BEGIN + Post Load (0.000000) SELECT * FROM posts WHERE (posts.id = 1) LIMIT 1 + Post Columns (0.000000) SHOW FIELDS FROM posts + Tag Load (0.000000) SELECT tags.* FROM tags INNER JOIN taggings ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 1 AND taggings.taggable_type = 'Post')  + Tag Columns (0.000000) SHOW FIELDS FROM tags + Post Update (0.000000) UPDATE posts SET `text` = 'The sky is particularly blue today', `user_id` = 1 WHERE id = 1 + Tagging Columns (0.016000) SHOW FIELDS FROM taggings + Tagging Load Including Associations (0.000000) SELECT taggings.`id` AS t0_r0, taggings.`tag_id` AS t0_r1, taggings.`taggable_id` AS t0_r2, taggings.`taggable_type` AS t0_r3, taggings.`created_at` AS t0_r4, tags.`id` AS t1_r0, tags.`name` AS t1_r1 FROM taggings LEFT OUTER JOIN tags ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 1 AND taggings.taggable_type = 'Post')  + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.`name` = 'One' ) LIMIT 1 + SQL (0.000000) INSERT INTO tags (`name`) VALUES('One') + SQL (0.000000) INSERT INTO taggings (`tag_id`, `taggable_type`, `taggable_id`, `created_at`) VALUES(6, 'Post', 1, '2006-09-21 23:35:29') + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.`name` = 'Two' ) LIMIT 1 + SQL (0.000000) INSERT INTO tags (`name`) VALUES('Two') + SQL (0.000000) INSERT INTO taggings (`tag_id`, `taggable_type`, `taggable_id`, `created_at`) VALUES(7, 'Post', 1, '2006-09-21 23:35:29') + Tag Load (0.000000) SELECT tags.* FROM tags INNER JOIN taggings ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 1 AND taggings.taggable_type = 'Post')  + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + Tag Load (0.016000)  select tags.id, tags.name, count(*) as count + from tags left outer join taggings on tags.id = taggings.tag_id + left outer join posts on posts.id = taggings.taggable_id + where taggings.taggable_type = "Post" + + group by tags.id + having count(*) > 0 + + + + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 2) LIMIT 1 + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 4) LIMIT 1 + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 3) LIMIT 1 + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 1) LIMIT 1 + Tag Load (0.000000)  select tags.id, tags.name, count(*) as count + from tags left outer join taggings on tags.id = taggings.tag_id + left outer join photos on photos.id = taggings.taggable_id + where taggings.taggable_type = "Photo" + + group by tags.id + having count(*) > 0 + + + + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 5) LIMIT 1 + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + Photo Load (0.000000) SELECT * FROM photos WHERE (photos.id = 2) LIMIT 1 + Photo Columns (0.000000) SHOW FIELDS FROM photos + Tag Load (0.000000) SELECT tags.* FROM tags INNER JOIN taggings ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 2 AND taggings.taggable_type = 'Photo')  + Photo Update (0.000000) UPDATE photos SET `title` = 'What does this dog want?', `user_id` = 1 WHERE id = 2 + Tagging Load Including Associations (0.000000) SELECT taggings.`id` AS t0_r0, taggings.`tag_id` AS t0_r1, taggings.`taggable_id` AS t0_r2, taggings.`taggable_type` AS t0_r3, taggings.`created_at` AS t0_r4, tags.`id` AS t1_r0, tags.`name` AS t1_r1 FROM taggings LEFT OUTER JOIN tags ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 2 AND taggings.taggable_type = 'Photo')  + Tagging Delete all (0.000000) DELETE FROM taggings WHERE (id in (12,13))  + Tag Load (0.000000) SELECT tags.* FROM tags INNER JOIN taggings ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 2 AND taggings.taggable_type = 'Photo')  + Photo Load (0.000000) SELECT * FROM photos WHERE (photos.id = 2) LIMIT 1 + Tag Load (0.000000) SELECT tags.* FROM tags INNER JOIN taggings ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 2 AND taggings.taggable_type = 'Photo')  + Photo Load (0.000000) SELECT * FROM photos WHERE (photos.id = 2) LIMIT 1 + Tag Load (0.000000) SELECT tags.* FROM tags INNER JOIN taggings ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 2 AND taggings.taggable_type = 'Photo')  + SQL (0.015000) ROLLBACK + SQL (0.000000) BEGIN + Photo Load (0.000000) SELECT * FROM photos WHERE (photos.id = 2) LIMIT 1 + Tag Load (0.000000) SELECT tags.* FROM tags INNER JOIN taggings ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 2 AND taggings.taggable_type = 'Photo')  + Photo Update (0.000000) UPDATE photos SET `title` = 'What does this dog want?', `user_id` = 1 WHERE id = 2 + Tagging Load Including Associations (0.000000) SELECT taggings.`id` AS t0_r0, taggings.`tag_id` AS t0_r1, taggings.`taggable_id` AS t0_r2, taggings.`taggable_type` AS t0_r3, taggings.`created_at` AS t0_r4, tags.`id` AS t1_r0, tags.`name` AS t1_r1 FROM taggings LEFT OUTER JOIN tags ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 2 AND taggings.taggable_type = 'Photo')  + Tagging Delete all (0.000000) DELETE FROM taggings WHERE (id in (12,13))  + Tag Load (0.000000) SELECT tags.* FROM tags INNER JOIN taggings ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 2 AND taggings.taggable_type = 'Photo')  + Photo Load (0.000000) SELECT * FROM photos WHERE (photos.id = 2) LIMIT 1 + Tag Load (0.000000) SELECT tags.* FROM tags INNER JOIN taggings ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 2 AND taggings.taggable_type = 'Photo')  + Photo Load (0.000000) SELECT * FROM photos WHERE (photos.id = 2) LIMIT 1 + Tag Load (0.000000) SELECT tags.* FROM tags INNER JOIN taggings ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 2 AND taggings.taggable_type = 'Photo')  + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + Post Load (0.000000) SELECT * FROM posts WHERE (posts.id = 1) LIMIT 1 + Post Load (0.000000) SELECT * FROM posts WHERE (posts.id = 5) LIMIT 1 + Post Load (0.016000) SELECT DISTINCT posts.* FROM posts left outer join taggings on taggings.taggable_id = posts.id left outer join tags on tags.id = taggings.tag_id WHERE (tags.name in ('Very good'))  + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + Post Load (0.000000) SELECT DISTINCT posts.* FROM posts left outer join taggings on taggings.taggable_id = posts.id left outer join tags on tags.id = taggings.tag_id WHERE (tags.name in ('ABCDEFG'))  + Photo Load (0.000000) SELECT DISTINCT photos.* FROM photos left outer join taggings on taggings.taggable_id = photos.id left outer join tags on tags.id = taggings.tag_id WHERE (tags.name in ('HIJKLM'))  + Photo Load (0.000000) SELECT DISTINCT photos.* FROM photos left outer join taggings on taggings.taggable_id = photos.id left outer join tags on tags.id = taggings.tag_id WHERE (tags.name in ('unsaved tag'))  + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + Photo Load (0.000000) SELECT * FROM photos WHERE (photos.id = 2) LIMIT 1 + Tag Load (0.000000) SELECT tags.* FROM tags INNER JOIN taggings ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 2 AND taggings.taggable_type = 'Photo')  + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + Post Load (0.000000) SELECT * FROM posts WHERE (posts.id = 3) LIMIT 1 + Tag Load (0.000000) SELECT tags.* FROM tags INNER JOIN taggings ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 3 AND taggings.taggable_type = 'Post')  + Post Update (0.000000) UPDATE posts SET `text` = 'Why does the rain fall?', `user_id` = 1 WHERE id = 3 + Tagging Load Including Associations (0.000000) SELECT taggings.`id` AS t0_r0, taggings.`tag_id` AS t0_r1, taggings.`taggable_id` AS t0_r2, taggings.`taggable_type` AS t0_r3, taggings.`created_at` AS t0_r4, tags.`id` AS t1_r0, tags.`name` AS t1_r1 FROM taggings LEFT OUTER JOIN tags ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 3 AND taggings.taggable_type = 'Post')  + Tag Load (0.000000) SELECT tags.* FROM tags INNER JOIN taggings ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 3 AND taggings.taggable_type = 'Post')  + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + Post Load (0.000000) SELECT * FROM posts WHERE (posts.id = 1) LIMIT 1 + Tag Load (0.000000) SELECT tags.* FROM tags INNER JOIN taggings ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 1 AND taggings.taggable_type = 'Post')  + Post Update (0.000000) UPDATE posts SET `text` = 'The sky is particularly blue today', `user_id` = 1 WHERE id = 1 + Tagging Load Including Associations (0.000000) SELECT taggings.`id` AS t0_r0, taggings.`tag_id` AS t0_r1, taggings.`taggable_id` AS t0_r2, taggings.`taggable_type` AS t0_r3, taggings.`created_at` AS t0_r4, tags.`id` AS t1_r0, tags.`name` AS t1_r1 FROM taggings LEFT OUTER JOIN tags ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 1 AND taggings.taggable_type = 'Post')  + Tagging Delete all (0.000000) DELETE FROM taggings WHERE (id in (1))  + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.`name` = 'Beautiful' ) LIMIT 1 + SQL (0.000000) INSERT INTO tags (`name`) VALUES('Beautiful') + SQL (0.000000) INSERT INTO taggings (`tag_id`, `taggable_type`, `taggable_id`, `created_at`) VALUES(8, 'Post', 1, '2006-09-21 23:35:30') + Tag Load (0.000000) SELECT tags.* FROM tags INNER JOIN taggings ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 1 AND taggings.taggable_type = 'Post')  + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + Post Load (0.000000) SELECT * FROM posts WHERE (posts.id = 1) LIMIT 1 + Tag Load (0.000000) SELECT tags.* FROM tags INNER JOIN taggings ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 1 AND taggings.taggable_type = 'Post')  + Post Update (0.000000) UPDATE posts SET `text` = 'The sky is particularly blue today', `user_id` = 1 WHERE id = 1 + Tagging Load Including Associations (0.000000) SELECT taggings.`id` AS t0_r0, taggings.`tag_id` AS t0_r1, taggings.`taggable_id` AS t0_r2, taggings.`taggable_type` AS t0_r3, taggings.`created_at` AS t0_r4, tags.`id` AS t1_r0, tags.`name` AS t1_r1 FROM taggings LEFT OUTER JOIN tags ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 1 AND taggings.taggable_type = 'Post')  + Tagging Delete all (0.000000) DELETE FROM taggings WHERE (id in (1))  + Tag Load (0.000000) SELECT tags.* FROM tags INNER JOIN taggings ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 1 AND taggings.taggable_type = 'Post')  + SQL (0.015000) ROLLBACK + SQL (0.000000) BEGIN + User Load (0.000000) SELECT * FROM users WHERE (users.id = 1) LIMIT 1 + User Columns (0.000000) SHOW FIELDS FROM users + Post Load (0.000000) SELECT * FROM posts WHERE (posts.user_id = 1)  + Tag Load (0.000000)  select tags.id, tags.name, count(*) as count + from tags left outer join taggings on tags.id = taggings.tag_id + left outer join posts on posts.id = taggings.taggable_id + where taggings.taggable_type = "Post" + and posts.user_id = 1 + group by tags.id + having count(*) > 0 + + + + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 4) LIMIT 1 + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 3) LIMIT 1 + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 1) LIMIT 1 + User Load (0.000000) SELECT * FROM users WHERE (users.id = 2) LIMIT 1 + Post Load (0.000000) SELECT * FROM posts WHERE (posts.user_id = 2)  + Tag Load (0.000000)  select tags.id, tags.name, count(*) as count + from tags left outer join taggings on tags.id = taggings.tag_id + left outer join posts on posts.id = taggings.taggable_id + where taggings.taggable_type = "Post" + and posts.user_id = 2 + group by tags.id + having count(*) > 0 + + + + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 2) LIMIT 1 + Photo Load (0.000000) SELECT * FROM photos WHERE (photos.user_id = 1)  + Tag Load (0.016000)  select tags.id, tags.name, count(*) as count + from tags left outer join taggings on tags.id = taggings.tag_id + left outer join photos on photos.id = taggings.taggable_id + where taggings.taggable_type = "Photo" + and photos.user_id = 1 + group by tags.id + having count(*) > 0 + + + + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 5) LIMIT 1 + Photo Load (0.000000) SELECT * FROM photos WHERE (photos.user_id = 2)  + Tag Load (0.000000)  select tags.id, tags.name, count(*) as count + from tags left outer join taggings on tags.id = taggings.tag_id + left outer join photos on photos.id = taggings.taggable_id + where taggings.taggable_type = "Photo" + and photos.user_id = 2 + group by tags.id + having count(*) > 0 + + + + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + User Load (0.000000) SELECT * FROM users WHERE (users.id = 1) LIMIT 1 + Post Load (0.000000) SELECT * FROM posts WHERE (posts.user_id = 1)  + Tag Load (0.000000)  select tags.id, tags.name, count(*) as count + from tags left outer join taggings on tags.id = taggings.tag_id + left outer join posts on posts.id = taggings.taggable_id + where taggings.taggable_type = "Post" + and 1=0 and posts.user_id = 1 + group by tags.id + having count(*) > 0 + + + + Tag Load (0.000000)  select tags.id, tags.name, count(*) as count + from tags left outer join taggings on tags.id = taggings.tag_id + left outer join posts on posts.id = taggings.taggable_id + where taggings.taggable_type = "Post" + and posts.user_id = 1 + group by tags.id + having count(*) > 0 and count <= 2 + + + + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 4) LIMIT 1 + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 1) LIMIT 1 + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + Tag Load (0.000000)  select tags.id, tags.name, count(*) as count + from tags left outer join taggings on tags.id = taggings.tag_id + left outer join posts on posts.id = taggings.taggable_id + where taggings.taggable_type = "Post" + and taggings.created_at >= '2006-08-04' + group by tags.id + having count(*) > 0 + + + + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 2) LIMIT 1 + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 4) LIMIT 1 + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 3) LIMIT 1 + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 1) LIMIT 1 + Tag Load (0.000000)  select tags.id, tags.name, count(*) as count + from tags left outer join taggings on tags.id = taggings.tag_id + left outer join posts on posts.id = taggings.taggable_id + where taggings.taggable_type = "Post" + and taggings.created_at <= '2006-08-06' + group by tags.id + having count(*) > 0 + + + + Tag Load (0.016000)  select tags.id, tags.name, count(*) as count + from tags left outer join taggings on tags.id = taggings.tag_id + left outer join posts on posts.id = taggings.taggable_id + where taggings.taggable_type = "Post" + and taggings.created_at >= '2006-08-05' and taggings.created_at <= '2006-08-08' + group by tags.id + having count(*) > 0 + + + + Tag Load (0.000000)  select tags.id, tags.name, count(*) as count + from tags left outer join taggings on tags.id = taggings.tag_id + left outer join photos on photos.id = taggings.taggable_id + where taggings.taggable_type = "Photo" + and taggings.created_at >= '2006-08-12' and taggings.created_at <= '2006-08-17' + group by tags.id + having count(*) > 0 + + + + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 5) LIMIT 1 + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + Tag Load (0.000000)  select tags.id, tags.name, count(*) as count + from tags left outer join taggings on tags.id = taggings.tag_id + left outer join photos on photos.id = taggings.taggable_id + where taggings.taggable_type = "Photo" + + group by tags.id + having count(*) > 0 and count >= 2 + + + + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 5) LIMIT 1 + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 3) LIMIT 1 + Tag Load (0.000000)  select tags.id, tags.name, count(*) as count + from tags left outer join taggings on tags.id = taggings.tag_id + left outer join photos on photos.id = taggings.taggable_id + where taggings.taggable_type = "Photo" + + group by tags.id + having count(*) > 0 and count <= 2 + + + + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 2) LIMIT 1 + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 4) LIMIT 1 + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 1) LIMIT 1 + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + Tag Load (0.000000)  select tags.id, tags.name, count(*) as count + from tags left outer join taggings on tags.id = taggings.tag_id + left outer join photos on photos.id = taggings.taggable_id + where taggings.taggable_type = "Photo" + + group by tags.id + having count(*) > 0 + + limit 2 + + Tag Load (0.000000)  select tags.id, tags.name, count(*) as count + from tags left outer join taggings on tags.id = taggings.tag_id + left outer join posts on posts.id = taggings.taggable_id + where taggings.taggable_type = "Post" + + group by tags.id + having count(*) > 0 and count >= 4 + + limit 2 + + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 3) LIMIT 1 + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 1) LIMIT 1 + Tag Load (0.000000)  select tags.id, tags.name, count(*) as count + from tags left outer join taggings on tags.id = taggings.tag_id + left outer join posts on posts.id = taggings.taggable_id + where taggings.taggable_type = "Post" + + group by tags.id + having count(*) > 0 + order by count desc + limit 2 + + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + Post Load (0.000000) SELECT * FROM posts WHERE (posts.id = 1) LIMIT 1 + Tag Load (0.000000) SELECT tags.* FROM tags INNER JOIN taggings ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 1 AND taggings.taggable_type = 'Post')  + Photo Load (0.000000) SELECT * FROM photos WHERE (photos.id = 3) LIMIT 1 + Tag Load (0.000000) SELECT tags.* FROM tags INNER JOIN taggings ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 3 AND taggings.taggable_type = 'Photo')  + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + Photo Load (0.000000) SELECT * FROM photos WHERE (photos.id = 2) LIMIT 1 + Tag Load (0.000000) SELECT tags.* FROM tags INNER JOIN taggings ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 2 AND taggings.taggable_type = 'Photo')  + Photo Load (0.000000) SELECT * FROM photos WHERE (photos.id = 2) LIMIT 1 + Tag Load (0.000000) SELECT tags.* FROM tags INNER JOIN taggings ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 2 AND taggings.taggable_type = 'Photo')  + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + Post Load (0.000000) SELECT * FROM posts WHERE (posts.id = 1) LIMIT 1 + Tag Load (0.000000) SELECT tags.* FROM tags INNER JOIN taggings ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 1 AND taggings.taggable_type = 'Post')  + Post Load (0.000000) SELECT * FROM posts WHERE (posts.id = 1) LIMIT 1 + Tag Load (0.000000) SELECT tags.* FROM tags INNER JOIN taggings ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 1 AND taggings.taggable_type = 'Post')  + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 1) LIMIT 1 + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 1) LIMIT 1 + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 1) LIMIT 1 + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 1) LIMIT 1 + Tagging Load (0.000000) SELECT * FROM taggings WHERE (taggings.tag_id = 1)  + Post Load (0.000000) SELECT * FROM posts WHERE (posts.id = 1) LIMIT 1 + Post Load (0.000000) SELECT * FROM posts WHERE (posts.id = 5) LIMIT 1 + Photo Load (0.000000) SELECT * FROM photos WHERE (photos.id = 4) LIMIT 1 + Post Load (0.000000) SELECT * FROM posts WHERE (posts.id = 2) LIMIT 1 + SQL (0.000000) INSERT INTO taggings (`tag_id`, `taggable_type`, `taggable_id`, `created_at`) VALUES(1, 'Post', 2, '2006-09-21 23:35:30') + Tagging Load (0.000000) SELECT * FROM taggings WHERE (taggings.tag_id = 1)  + Post Load (0.000000) SELECT * FROM posts WHERE (posts.id = 1) LIMIT 1 + Post Load (0.000000) SELECT * FROM posts WHERE (posts.id = 5) LIMIT 1 + Photo Load (0.000000) SELECT * FROM photos WHERE (photos.id = 4) LIMIT 1 + Post Load (0.000000) SELECT * FROM posts WHERE (posts.id = 2) LIMIT 1 + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + Post Load (0.000000) SELECT * FROM posts WHERE (posts.id = 1) LIMIT 1 + Post Load (0.000000) SELECT * FROM posts WHERE (posts.id = 5) LIMIT 1 + Photo Load (0.000000) SELECT * FROM photos WHERE (photos.id = 4) LIMIT 1 + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 1) LIMIT 1 + Tagging Load (0.000000) SELECT * FROM taggings WHERE (taggings.tag_id = 1)  + Post Load (0.000000) SELECT * FROM posts WHERE (posts.id = 1) LIMIT 1 + Post Load (0.000000) SELECT * FROM posts WHERE (posts.id = 5) LIMIT 1 + Photo Load (0.000000) SELECT * FROM photos WHERE (photos.id = 4) LIMIT 1 + Post Load (0.000000) SELECT * FROM posts WHERE (posts.id = 4) LIMIT 1 + Photo Load (0.000000) SELECT * FROM photos WHERE (photos.id = 3) LIMIT 1 + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 2) LIMIT 1 + Tagging Load (0.000000) SELECT * FROM taggings WHERE (taggings.tag_id = 2)  + Post Load (0.000000) SELECT * FROM posts WHERE (posts.id = 4) LIMIT 1 + Photo Load (0.000000) SELECT * FROM photos WHERE (photos.id = 3) LIMIT 1 + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + Tagging Load (0.000000) SELECT * FROM taggings WHERE (taggings.id = 1) LIMIT 1 + Tagging Load (0.000000) SELECT * FROM taggings WHERE (taggings.id = 8) LIMIT 1 + Tagging Load (0.000000) SELECT * FROM taggings WHERE (taggings.id = 17) LIMIT 1 + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 1) LIMIT 1 + Tagging Load (0.000000) SELECT * FROM taggings WHERE (taggings.tag_id = 1)  + Tagging Load (0.000000) SELECT * FROM taggings WHERE (taggings.id = 7) LIMIT 1 + Tagging Load (0.000000) SELECT * FROM taggings WHERE (taggings.id = 14) LIMIT 1 + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 2) LIMIT 1 + Tagging Load (0.000000) SELECT * FROM taggings WHERE (taggings.tag_id = 2)  + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 1) LIMIT 1 + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 1) LIMIT 1 + Tagging Load (0.000000) SELECT * FROM taggings WHERE (taggings.id = 1) LIMIT 1 + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 1) LIMIT 1 + SQL (0.000000) ROLLBACK + SQL (0.000000) DROP TABLE tags + SQL (0.015000) CREATE TABLE tags (`id` int(11) DEFAULT NULL auto_increment PRIMARY KEY, `name` varchar(255)) ENGINE=InnoDB + SQL (0.000000) DROP TABLE taggings + SQL (0.000000) CREATE TABLE taggings (`id` int(11) DEFAULT NULL auto_increment PRIMARY KEY, `tag_id` int(11), `taggable_id` int(11), `taggable_type` varchar(255), `created_at` datetime) ENGINE=InnoDB + SQL (0.000000) DROP TABLE users + SQL (0.000000) CREATE TABLE users (`id` int(11) DEFAULT NULL auto_increment PRIMARY KEY, `name` varchar(255)) ENGINE=InnoDB + SQL (0.016000) DROP TABLE posts + SQL (0.000000) CREATE TABLE posts (`id` int(11) DEFAULT NULL auto_increment PRIMARY KEY, `text` text, `user_id` int(11)) ENGINE=InnoDB + SQL (0.000000) DROP TABLE photos + SQL (0.000000) CREATE TABLE photos (`id` int(11) DEFAULT NULL auto_increment PRIMARY KEY, `title` varchar(255), `user_id` int(11)) ENGINE=InnoDB + SQL (0.000000) Mysql::Error: Table 'schema_info' already exists: CREATE TABLE schema_info (version int(11)) + SQL (0.016000) SHOW FIELDS FROM schema_info + SQL (0.000000) UPDATE schema_info SET version = 0 + SQL (0.000000) BEGIN + Post Load (0.000000) SELECT * FROM posts WHERE (posts.id = 1) LIMIT 1 + Post Columns (0.000000) SHOW FIELDS FROM posts + Tag Load (0.000000) SELECT tags.* FROM tags INNER JOIN taggings ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 1 AND taggings.taggable_type = 'Post')  + Tag Columns (0.000000) SHOW FIELDS FROM tags + Post Update (0.000000) UPDATE posts SET `text` = 'The sky is particularly blue today', `user_id` = 1 WHERE id = 1 + Tagging Columns (0.000000) SHOW FIELDS FROM taggings + Tagging Load Including Associations (0.000000) SELECT taggings.`id` AS t0_r0, taggings.`tag_id` AS t0_r1, taggings.`taggable_id` AS t0_r2, taggings.`taggable_type` AS t0_r3, taggings.`created_at` AS t0_r4, tags.`id` AS t1_r0, tags.`name` AS t1_r1 FROM taggings LEFT OUTER JOIN tags ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 1 AND taggings.taggable_type = 'Post')  + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.`name` = 'One' ) LIMIT 1 + SQL (0.000000) INSERT INTO tags (`name`) VALUES('One') + SQL (0.000000) INSERT INTO taggings (`tag_id`, `taggable_type`, `taggable_id`, `created_at`) VALUES(6, 'Post', 1, '2006-09-21 23:36:49') + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.`name` = 'Two' ) LIMIT 1 + SQL (0.000000) INSERT INTO tags (`name`) VALUES('Two') + SQL (0.000000) INSERT INTO taggings (`tag_id`, `taggable_type`, `taggable_id`, `created_at`) VALUES(7, 'Post', 1, '2006-09-21 23:36:49') + Tag Load (0.000000) SELECT tags.* FROM tags INNER JOIN taggings ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 1 AND taggings.taggable_type = 'Post')  + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + Tag Load (0.000000)  select tags.id, tags.name, count(*) as count + from tags left outer join taggings on tags.id = taggings.tag_id + left outer join posts on posts.id = taggings.taggable_id + where taggings.taggable_type = "Post" + + group by tags.id + having count(*) > 0 + + + + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 1) LIMIT 1 + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 4) LIMIT 1 + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 2) LIMIT 1 + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 3) LIMIT 1 + Tag Load (0.000000)  select tags.id, tags.name, count(*) as count + from tags left outer join taggings on tags.id = taggings.tag_id + left outer join photos on photos.id = taggings.taggable_id + where taggings.taggable_type = "Photo" + + group by tags.id + having count(*) > 0 + + + + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 5) LIMIT 1 + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + Photo Load (0.000000) SELECT * FROM photos WHERE (photos.id = 2) LIMIT 1 + Photo Columns (0.000000) SHOW FIELDS FROM photos + Tag Load (0.000000) SELECT tags.* FROM tags INNER JOIN taggings ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 2 AND taggings.taggable_type = 'Photo')  + Photo Update (0.000000) UPDATE photos SET `title` = 'What does this dog want?', `user_id` = 1 WHERE id = 2 + Tagging Load Including Associations (0.000000) SELECT taggings.`id` AS t0_r0, taggings.`tag_id` AS t0_r1, taggings.`taggable_id` AS t0_r2, taggings.`taggable_type` AS t0_r3, taggings.`created_at` AS t0_r4, tags.`id` AS t1_r0, tags.`name` AS t1_r1 FROM taggings LEFT OUTER JOIN tags ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 2 AND taggings.taggable_type = 'Photo')  + Tagging Delete all (0.000000) DELETE FROM taggings WHERE (id in (12,13))  + Tag Load (0.000000) SELECT tags.* FROM tags INNER JOIN taggings ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 2 AND taggings.taggable_type = 'Photo')  + Photo Load (0.000000) SELECT * FROM photos WHERE (photos.id = 2) LIMIT 1 + Tag Load (0.000000) SELECT tags.* FROM tags INNER JOIN taggings ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 2 AND taggings.taggable_type = 'Photo')  + Photo Load (0.000000) SELECT * FROM photos WHERE (photos.id = 2) LIMIT 1 + Tag Load (0.000000) SELECT tags.* FROM tags INNER JOIN taggings ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 2 AND taggings.taggable_type = 'Photo')  + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + Photo Load (0.000000) SELECT * FROM photos WHERE (photos.id = 2) LIMIT 1 + Tag Load (0.000000) SELECT tags.* FROM tags INNER JOIN taggings ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 2 AND taggings.taggable_type = 'Photo')  + Photo Update (0.000000) UPDATE photos SET `title` = 'What does this dog want?', `user_id` = 1 WHERE id = 2 + Tagging Load Including Associations (0.000000) SELECT taggings.`id` AS t0_r0, taggings.`tag_id` AS t0_r1, taggings.`taggable_id` AS t0_r2, taggings.`taggable_type` AS t0_r3, taggings.`created_at` AS t0_r4, tags.`id` AS t1_r0, tags.`name` AS t1_r1 FROM taggings LEFT OUTER JOIN tags ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 2 AND taggings.taggable_type = 'Photo')  + Tagging Delete all (0.000000) DELETE FROM taggings WHERE (id in (12,13))  + Tag Load (0.000000) SELECT tags.* FROM tags INNER JOIN taggings ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 2 AND taggings.taggable_type = 'Photo')  + Photo Load (0.000000) SELECT * FROM photos WHERE (photos.id = 2) LIMIT 1 + Tag Load (0.000000) SELECT tags.* FROM tags INNER JOIN taggings ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 2 AND taggings.taggable_type = 'Photo')  + Photo Load (0.000000) SELECT * FROM photos WHERE (photos.id = 2) LIMIT 1 + Tag Load (0.000000) SELECT tags.* FROM tags INNER JOIN taggings ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 2 AND taggings.taggable_type = 'Photo')  + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN +BLAHBLAHBLAH + + + + + Post Load (0.000000) SELECT * FROM posts WHERE (posts.id = 1) LIMIT 1 + Post Load (0.000000) SELECT * FROM posts WHERE (posts.id = 5) LIMIT 1 + Post Load (0.000000) SELECT DISTINCT posts.* FROM posts left outer join taggings on taggings.taggable_id = posts.id left outer join tags on tags.id = taggings.tag_id WHERE (tags.name in ('Very good'))  + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + Post Load (0.000000) SELECT DISTINCT posts.* FROM posts left outer join taggings on taggings.taggable_id = posts.id left outer join tags on tags.id = taggings.tag_id WHERE (tags.name in ('ABCDEFG'))  + Photo Load (0.000000) SELECT DISTINCT photos.* FROM photos left outer join taggings on taggings.taggable_id = photos.id left outer join tags on tags.id = taggings.tag_id WHERE (tags.name in ('HIJKLM'))  + Photo Load (0.000000) SELECT DISTINCT photos.* FROM photos left outer join taggings on taggings.taggable_id = photos.id left outer join tags on tags.id = taggings.tag_id WHERE (tags.name in ('unsaved tag'))  + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + Photo Load (0.000000) SELECT * FROM photos WHERE (photos.id = 2) LIMIT 1 + Tag Load (0.000000) SELECT tags.* FROM tags INNER JOIN taggings ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 2 AND taggings.taggable_type = 'Photo')  + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + Post Load (0.000000) SELECT * FROM posts WHERE (posts.id = 3) LIMIT 1 + Tag Load (0.000000) SELECT tags.* FROM tags INNER JOIN taggings ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 3 AND taggings.taggable_type = 'Post')  + Post Update (0.000000) UPDATE posts SET `text` = 'Why does the rain fall?', `user_id` = 1 WHERE id = 3 + Tagging Load Including Associations (0.000000) SELECT taggings.`id` AS t0_r0, taggings.`tag_id` AS t0_r1, taggings.`taggable_id` AS t0_r2, taggings.`taggable_type` AS t0_r3, taggings.`created_at` AS t0_r4, tags.`id` AS t1_r0, tags.`name` AS t1_r1 FROM taggings LEFT OUTER JOIN tags ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 3 AND taggings.taggable_type = 'Post')  + Tag Load (0.000000) SELECT tags.* FROM tags INNER JOIN taggings ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 3 AND taggings.taggable_type = 'Post')  + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + Post Load (0.000000) SELECT * FROM posts WHERE (posts.id = 1) LIMIT 1 + Tag Load (0.000000) SELECT tags.* FROM tags INNER JOIN taggings ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 1 AND taggings.taggable_type = 'Post')  + Post Update (0.000000) UPDATE posts SET `text` = 'The sky is particularly blue today', `user_id` = 1 WHERE id = 1 + Tagging Load Including Associations (0.000000) SELECT taggings.`id` AS t0_r0, taggings.`tag_id` AS t0_r1, taggings.`taggable_id` AS t0_r2, taggings.`taggable_type` AS t0_r3, taggings.`created_at` AS t0_r4, tags.`id` AS t1_r0, tags.`name` AS t1_r1 FROM taggings LEFT OUTER JOIN tags ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 1 AND taggings.taggable_type = 'Post')  + Tagging Delete all (0.000000) DELETE FROM taggings WHERE (id in (1))  + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.`name` = 'Beautiful' ) LIMIT 1 + SQL (0.000000) INSERT INTO tags (`name`) VALUES('Beautiful') + SQL (0.000000) INSERT INTO taggings (`tag_id`, `taggable_type`, `taggable_id`, `created_at`) VALUES(8, 'Post', 1, '2006-09-21 23:36:49') + Tag Load (0.000000) SELECT tags.* FROM tags INNER JOIN taggings ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 1 AND taggings.taggable_type = 'Post')  + SQL (0.015000) ROLLBACK + SQL (0.000000) BEGIN + Post Load (0.000000) SELECT * FROM posts WHERE (posts.id = 1) LIMIT 1 + Tag Load (0.000000) SELECT tags.* FROM tags INNER JOIN taggings ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 1 AND taggings.taggable_type = 'Post')  + Post Update (0.000000) UPDATE posts SET `text` = 'The sky is particularly blue today', `user_id` = 1 WHERE id = 1 + Tagging Load Including Associations (0.000000) SELECT taggings.`id` AS t0_r0, taggings.`tag_id` AS t0_r1, taggings.`taggable_id` AS t0_r2, taggings.`taggable_type` AS t0_r3, taggings.`created_at` AS t0_r4, tags.`id` AS t1_r0, tags.`name` AS t1_r1 FROM taggings LEFT OUTER JOIN tags ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 1 AND taggings.taggable_type = 'Post')  + Tagging Delete all (0.000000) DELETE FROM taggings WHERE (id in (1))  + Tag Load (0.000000) SELECT tags.* FROM tags INNER JOIN taggings ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 1 AND taggings.taggable_type = 'Post')  + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + User Load (0.000000) SELECT * FROM users WHERE (users.id = 1) LIMIT 1 + User Columns (0.000000) SHOW FIELDS FROM users + Post Load (0.000000) SELECT * FROM posts WHERE (posts.user_id = 1)  + Tag Load (0.000000)  select tags.id, tags.name, count(*) as count + from tags left outer join taggings on tags.id = taggings.tag_id + left outer join posts on posts.id = taggings.taggable_id + where taggings.taggable_type = "Post" + and posts.user_id = 1 + group by tags.id + having count(*) > 0 + + + + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 1) LIMIT 1 + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 4) LIMIT 1 + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 3) LIMIT 1 + User Load (0.000000) SELECT * FROM users WHERE (users.id = 2) LIMIT 1 + Post Load (0.000000) SELECT * FROM posts WHERE (posts.user_id = 2)  + Tag Load (0.000000)  select tags.id, tags.name, count(*) as count + from tags left outer join taggings on tags.id = taggings.tag_id + left outer join posts on posts.id = taggings.taggable_id + where taggings.taggable_type = "Post" + and posts.user_id = 2 + group by tags.id + having count(*) > 0 + + + + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 2) LIMIT 1 + Photo Load (0.000000) SELECT * FROM photos WHERE (photos.user_id = 1)  + Tag Load (0.000000)  select tags.id, tags.name, count(*) as count + from tags left outer join taggings on tags.id = taggings.tag_id + left outer join photos on photos.id = taggings.taggable_id + where taggings.taggable_type = "Photo" + and photos.user_id = 1 + group by tags.id + having count(*) > 0 + + + + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 5) LIMIT 1 + Photo Load (0.000000) SELECT * FROM photos WHERE (photos.user_id = 2)  + Tag Load (0.000000)  select tags.id, tags.name, count(*) as count + from tags left outer join taggings on tags.id = taggings.tag_id + left outer join photos on photos.id = taggings.taggable_id + where taggings.taggable_type = "Photo" + and photos.user_id = 2 + group by tags.id + having count(*) > 0 + + + + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + User Load (0.000000) SELECT * FROM users WHERE (users.id = 1) LIMIT 1 + Post Load (0.000000) SELECT * FROM posts WHERE (posts.user_id = 1)  + Tag Load (0.000000)  select tags.id, tags.name, count(*) as count + from tags left outer join taggings on tags.id = taggings.tag_id + left outer join posts on posts.id = taggings.taggable_id + where taggings.taggable_type = "Post" + and 1=0 and posts.user_id = 1 + group by tags.id + having count(*) > 0 + + + + Tag Load (0.000000)  select tags.id, tags.name, count(*) as count + from tags left outer join taggings on tags.id = taggings.tag_id + left outer join posts on posts.id = taggings.taggable_id + where taggings.taggable_type = "Post" + and posts.user_id = 1 + group by tags.id + having count(*) > 0 and count <= 2 + + + + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 1) LIMIT 1 + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 4) LIMIT 1 + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + Tag Load (0.000000)  select tags.id, tags.name, count(*) as count + from tags left outer join taggings on tags.id = taggings.tag_id + left outer join posts on posts.id = taggings.taggable_id + where taggings.taggable_type = "Post" + and taggings.created_at >= '2006-08-04' + group by tags.id + having count(*) > 0 + + + + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 1) LIMIT 1 + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 4) LIMIT 1 + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 2) LIMIT 1 + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 3) LIMIT 1 + Tag Load (0.000000)  select tags.id, tags.name, count(*) as count + from tags left outer join taggings on tags.id = taggings.tag_id + left outer join posts on posts.id = taggings.taggable_id + where taggings.taggable_type = "Post" + and taggings.created_at <= '2006-08-06' + group by tags.id + having count(*) > 0 + + + + Tag Load (0.000000)  select tags.id, tags.name, count(*) as count + from tags left outer join taggings on tags.id = taggings.tag_id + left outer join posts on posts.id = taggings.taggable_id + where taggings.taggable_type = "Post" + and taggings.created_at >= '2006-08-05' and taggings.created_at <= '2006-08-08' + group by tags.id + having count(*) > 0 + + + + Tag Load (0.000000)  select tags.id, tags.name, count(*) as count + from tags left outer join taggings on tags.id = taggings.tag_id + left outer join photos on photos.id = taggings.taggable_id + where taggings.taggable_type = "Photo" + and taggings.created_at >= '2006-08-12' and taggings.created_at <= '2006-08-17' + group by tags.id + having count(*) > 0 + + + + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 5) LIMIT 1 + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + Tag Load (0.000000)  select tags.id, tags.name, count(*) as count + from tags left outer join taggings on tags.id = taggings.tag_id + left outer join photos on photos.id = taggings.taggable_id + where taggings.taggable_type = "Photo" + + group by tags.id + having count(*) > 0 and count >= 2 + + + + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 5) LIMIT 1 + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 3) LIMIT 1 + Tag Load (0.000000)  select tags.id, tags.name, count(*) as count + from tags left outer join taggings on tags.id = taggings.tag_id + left outer join photos on photos.id = taggings.taggable_id + where taggings.taggable_type = "Photo" + + group by tags.id + having count(*) > 0 and count <= 2 + + + + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 1) LIMIT 1 + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 4) LIMIT 1 + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 2) LIMIT 1 + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + Tag Load (0.000000)  select tags.id, tags.name, count(*) as count + from tags left outer join taggings on tags.id = taggings.tag_id + left outer join photos on photos.id = taggings.taggable_id + where taggings.taggable_type = "Photo" + + group by tags.id + having count(*) > 0 + + limit 2 + + Tag Load (0.000000)  select tags.id, tags.name, count(*) as count + from tags left outer join taggings on tags.id = taggings.tag_id + left outer join posts on posts.id = taggings.taggable_id + where taggings.taggable_type = "Post" + + group by tags.id + having count(*) > 0 and count >= 4 + + limit 2 + + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 3) LIMIT 1 + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 1) LIMIT 1 + Tag Load (0.000000)  select tags.id, tags.name, count(*) as count + from tags left outer join taggings on tags.id = taggings.tag_id + left outer join posts on posts.id = taggings.taggable_id + where taggings.taggable_type = "Post" + + group by tags.id + having count(*) > 0 + order by count desc + limit 2 + + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + Post Load (0.000000) SELECT * FROM posts WHERE (posts.id = 1) LIMIT 1 + Tag Load (0.000000) SELECT tags.* FROM tags INNER JOIN taggings ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 1 AND taggings.taggable_type = 'Post')  + Photo Load (0.000000) SELECT * FROM photos WHERE (photos.id = 3) LIMIT 1 + Tag Load (0.000000) SELECT tags.* FROM tags INNER JOIN taggings ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 3 AND taggings.taggable_type = 'Photo')  + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + Photo Load (0.000000) SELECT * FROM photos WHERE (photos.id = 2) LIMIT 1 + Tag Load (0.000000) SELECT tags.* FROM tags INNER JOIN taggings ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 2 AND taggings.taggable_type = 'Photo')  + Photo Load (0.000000) SELECT * FROM photos WHERE (photos.id = 2) LIMIT 1 + Tag Load (0.000000) SELECT tags.* FROM tags INNER JOIN taggings ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 2 AND taggings.taggable_type = 'Photo')  + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + Post Load (0.000000) SELECT * FROM posts WHERE (posts.id = 1) LIMIT 1 + Tag Load (0.000000) SELECT tags.* FROM tags INNER JOIN taggings ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 1 AND taggings.taggable_type = 'Post')  + Post Load (0.000000) SELECT * FROM posts WHERE (posts.id = 1) LIMIT 1 + Tag Load (0.000000) SELECT tags.* FROM tags INNER JOIN taggings ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 1 AND taggings.taggable_type = 'Post')  + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 1) LIMIT 1 + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 1) LIMIT 1 + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 1) LIMIT 1 + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + SQL (0.016000) ROLLBACK + SQL (0.000000) BEGIN + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + SQL (0.000000) ROLLBACK + SQL (0.015000) BEGIN + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 1) LIMIT 1 + Tagging Load (0.000000) SELECT * FROM taggings WHERE (taggings.tag_id = 1)  + Post Load (0.000000) SELECT * FROM posts WHERE (posts.id = 1) LIMIT 1 + Post Load (0.000000) SELECT * FROM posts WHERE (posts.id = 5) LIMIT 1 + Photo Load (0.000000) SELECT * FROM photos WHERE (photos.id = 4) LIMIT 1 + Post Load (0.000000) SELECT * FROM posts WHERE (posts.id = 2) LIMIT 1 + SQL (0.000000) INSERT INTO taggings (`tag_id`, `taggable_type`, `taggable_id`, `created_at`) VALUES(1, 'Post', 2, '2006-09-21 23:36:49') + Tagging Load (0.000000) SELECT * FROM taggings WHERE (taggings.tag_id = 1)  + Post Load (0.000000) SELECT * FROM posts WHERE (posts.id = 1) LIMIT 1 + Post Load (0.000000) SELECT * FROM posts WHERE (posts.id = 5) LIMIT 1 + Photo Load (0.000000) SELECT * FROM photos WHERE (photos.id = 4) LIMIT 1 + Post Load (0.000000) SELECT * FROM posts WHERE (posts.id = 2) LIMIT 1 + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + Post Load (0.000000) SELECT * FROM posts WHERE (posts.id = 1) LIMIT 1 + Post Load (0.000000) SELECT * FROM posts WHERE (posts.id = 5) LIMIT 1 + Photo Load (0.000000) SELECT * FROM photos WHERE (photos.id = 4) LIMIT 1 + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 1) LIMIT 1 + Tagging Load (0.000000) SELECT * FROM taggings WHERE (taggings.tag_id = 1)  + Post Load (0.000000) SELECT * FROM posts WHERE (posts.id = 1) LIMIT 1 + Post Load (0.000000) SELECT * FROM posts WHERE (posts.id = 5) LIMIT 1 + Photo Load (0.000000) SELECT * FROM photos WHERE (photos.id = 4) LIMIT 1 + Post Load (0.000000) SELECT * FROM posts WHERE (posts.id = 4) LIMIT 1 + Photo Load (0.000000) SELECT * FROM photos WHERE (photos.id = 3) LIMIT 1 + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 2) LIMIT 1 + Tagging Load (0.000000) SELECT * FROM taggings WHERE (taggings.tag_id = 2)  + Post Load (0.000000) SELECT * FROM posts WHERE (posts.id = 4) LIMIT 1 + Photo Load (0.000000) SELECT * FROM photos WHERE (photos.id = 3) LIMIT 1 + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + Tagging Load (0.000000) SELECT * FROM taggings WHERE (taggings.id = 1) LIMIT 1 + Tagging Load (0.000000) SELECT * FROM taggings WHERE (taggings.id = 8) LIMIT 1 + Tagging Load (0.000000) SELECT * FROM taggings WHERE (taggings.id = 17) LIMIT 1 + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 1) LIMIT 1 + Tagging Load (0.000000) SELECT * FROM taggings WHERE (taggings.tag_id = 1)  + Tagging Load (0.000000) SELECT * FROM taggings WHERE (taggings.id = 7) LIMIT 1 + Tagging Load (0.000000) SELECT * FROM taggings WHERE (taggings.id = 14) LIMIT 1 + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 2) LIMIT 1 + Tagging Load (0.000000) SELECT * FROM taggings WHERE (taggings.tag_id = 2)  + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 1) LIMIT 1 + SQL (0.015000) ROLLBACK + SQL (0.000000) BEGIN + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 1) LIMIT 1 + Tagging Load (0.000000) SELECT * FROM taggings WHERE (taggings.id = 1) LIMIT 1 + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 1) LIMIT 1 + SQL (0.000000) ROLLBACK + SQL (0.000000) DROP TABLE tags + SQL (0.000000) CREATE TABLE tags (`id` int(11) DEFAULT NULL auto_increment PRIMARY KEY, `name` varchar(255)) ENGINE=InnoDB + SQL (0.000000) DROP TABLE taggings + SQL (0.015000) CREATE TABLE taggings (`id` int(11) DEFAULT NULL auto_increment PRIMARY KEY, `tag_id` int(11), `taggable_id` int(11), `taggable_type` varchar(255), `created_at` datetime) ENGINE=InnoDB + SQL (0.000000) DROP TABLE users + SQL (0.000000) CREATE TABLE users (`id` int(11) DEFAULT NULL auto_increment PRIMARY KEY, `name` varchar(255)) ENGINE=InnoDB + SQL (0.000000) DROP TABLE posts + SQL (0.016000) CREATE TABLE posts (`id` int(11) DEFAULT NULL auto_increment PRIMARY KEY, `text` text, `user_id` int(11)) ENGINE=InnoDB + SQL (0.000000) DROP TABLE photos + SQL (0.000000) CREATE TABLE photos (`id` int(11) DEFAULT NULL auto_increment PRIMARY KEY, `title` varchar(255), `user_id` int(11)) ENGINE=InnoDB + SQL (0.000000) Mysql::Error: Table 'schema_info' already exists: CREATE TABLE schema_info (version int(11)) + SQL (0.000000) SHOW FIELDS FROM schema_info + SQL (0.000000) UPDATE schema_info SET version = 0 + SQL (0.000000) BEGIN + Post Load (0.000000) SELECT * FROM posts WHERE (posts.id = 1) LIMIT 1 + Post Columns (0.000000) SHOW FIELDS FROM posts + Tag Load (0.000000) SELECT tags.* FROM tags INNER JOIN taggings ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 1 AND taggings.taggable_type = 'Post')  + Tag Columns (0.000000) SHOW FIELDS FROM tags + Post Update (0.000000) UPDATE posts SET `text` = 'The sky is particularly blue today', `user_id` = 1 WHERE id = 1 + Tagging Columns (0.000000) SHOW FIELDS FROM taggings + Tagging Load Including Associations (0.000000) SELECT taggings.`id` AS t0_r0, taggings.`tag_id` AS t0_r1, taggings.`taggable_id` AS t0_r2, taggings.`taggable_type` AS t0_r3, taggings.`created_at` AS t0_r4, tags.`id` AS t1_r0, tags.`name` AS t1_r1 FROM taggings LEFT OUTER JOIN tags ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 1 AND taggings.taggable_type = 'Post')  + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.`name` = 'One' ) LIMIT 1 + SQL (0.000000) INSERT INTO tags (`name`) VALUES('One') + SQL (0.000000) INSERT INTO taggings (`tag_id`, `taggable_type`, `taggable_id`, `created_at`) VALUES(6, 'Post', 1, '2006-09-21 23:37:53') + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.`name` = 'Two' ) LIMIT 1 + SQL (0.000000) INSERT INTO tags (`name`) VALUES('Two') + SQL (0.000000) INSERT INTO taggings (`tag_id`, `taggable_type`, `taggable_id`, `created_at`) VALUES(7, 'Post', 1, '2006-09-21 23:37:53') + Tag Load (0.000000) SELECT tags.* FROM tags INNER JOIN taggings ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 1 AND taggings.taggable_type = 'Post')  + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + Tag Load (0.000000)  select tags.id, tags.name, count(*) as count + from tags left outer join taggings on tags.id = taggings.tag_id + left outer join posts on posts.id = taggings.taggable_id + where taggings.taggable_type = "Post" + + group by tags.id + having count(*) > 0 + + + + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 1) LIMIT 1 + Tag Load (0.016000) SELECT * FROM tags WHERE (tags.id = 4) LIMIT 1 + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 2) LIMIT 1 + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 3) LIMIT 1 + Tag Load (0.000000)  select tags.id, tags.name, count(*) as count + from tags left outer join taggings on tags.id = taggings.tag_id + left outer join photos on photos.id = taggings.taggable_id + where taggings.taggable_type = "Photo" + + group by tags.id + having count(*) > 0 + + + + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 5) LIMIT 1 + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + Photo Load (0.000000) SELECT * FROM photos WHERE (photos.id = 2) LIMIT 1 + Photo Columns (0.000000) SHOW FIELDS FROM photos + Tag Load (0.000000) SELECT tags.* FROM tags INNER JOIN taggings ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 2 AND taggings.taggable_type = 'Photo')  + Photo Update (0.000000) UPDATE photos SET `title` = 'What does this dog want?', `user_id` = 1 WHERE id = 2 + Tagging Load Including Associations (0.000000) SELECT taggings.`id` AS t0_r0, taggings.`tag_id` AS t0_r1, taggings.`taggable_id` AS t0_r2, taggings.`taggable_type` AS t0_r3, taggings.`created_at` AS t0_r4, tags.`id` AS t1_r0, tags.`name` AS t1_r1 FROM taggings LEFT OUTER JOIN tags ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 2 AND taggings.taggable_type = 'Photo')  + Tagging Delete all (0.000000) DELETE FROM taggings WHERE (id in (12,13))  + Tag Load (0.016000) SELECT tags.* FROM tags INNER JOIN taggings ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 2 AND taggings.taggable_type = 'Photo')  + Photo Load (0.000000) SELECT * FROM photos WHERE (photos.id = 2) LIMIT 1 + Tag Load (0.000000) SELECT tags.* FROM tags INNER JOIN taggings ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 2 AND taggings.taggable_type = 'Photo')  + Photo Load (0.000000) SELECT * FROM photos WHERE (photos.id = 2) LIMIT 1 + Tag Load (0.000000) SELECT tags.* FROM tags INNER JOIN taggings ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 2 AND taggings.taggable_type = 'Photo')  + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + Photo Load (0.000000) SELECT * FROM photos WHERE (photos.id = 2) LIMIT 1 + Tag Load (0.000000) SELECT tags.* FROM tags INNER JOIN taggings ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 2 AND taggings.taggable_type = 'Photo')  + Photo Update (0.000000) UPDATE photos SET `title` = 'What does this dog want?', `user_id` = 1 WHERE id = 2 + Tagging Load Including Associations (0.000000) SELECT taggings.`id` AS t0_r0, taggings.`tag_id` AS t0_r1, taggings.`taggable_id` AS t0_r2, taggings.`taggable_type` AS t0_r3, taggings.`created_at` AS t0_r4, tags.`id` AS t1_r0, tags.`name` AS t1_r1 FROM taggings LEFT OUTER JOIN tags ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 2 AND taggings.taggable_type = 'Photo')  + Tagging Delete all (0.000000) DELETE FROM taggings WHERE (id in (12,13))  + Tag Load (0.000000) SELECT tags.* FROM tags INNER JOIN taggings ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 2 AND taggings.taggable_type = 'Photo')  + Photo Load (0.000000) SELECT * FROM photos WHERE (photos.id = 2) LIMIT 1 + Tag Load (0.000000) SELECT tags.* FROM tags INNER JOIN taggings ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 2 AND taggings.taggable_type = 'Photo')  + Photo Load (0.000000) SELECT * FROM photos WHERE (photos.id = 2) LIMIT 1 + Tag Load (0.000000) SELECT tags.* FROM tags INNER JOIN taggings ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 2 AND taggings.taggable_type = 'Photo')  + SQL (0.000000) ROLLBACK + SQL (0.015000) BEGIN +BLAHBLAHBLAH + + + + + Post Load (0.000000) SELECT * FROM posts WHERE (posts.id = 1) LIMIT 1 + Post Load (0.000000) SELECT * FROM posts WHERE (posts.id = 5) LIMIT 1 + Post Load (0.000000) SELECT DISTINCT posts.* FROM posts left outer join taggings on taggings.taggable_id = posts.id and taggings.taggable_type = 'Post' left outer join tags on tags.id = taggings.tag_id WHERE (tags.name in ('Very good'))  + Post Load (0.000000) SELECT DISTINCT posts.* FROM posts left outer join taggings on taggings.taggable_id = posts.id and taggings.taggable_type = 'Post' left outer join tags on tags.id = taggings.tag_id WHERE (tags.name in ('Very good'))  + Post Load (0.000000) SELECT DISTINCT posts.* FROM posts left outer join taggings on taggings.taggable_id = posts.id and taggings.taggable_type = 'Post' left outer join tags on tags.id = taggings.tag_id WHERE (tags.name in ('Very good'))  + Post Load (0.000000) SELECT DISTINCT posts.* FROM posts left outer join taggings on taggings.taggable_id = posts.id and taggings.taggable_type = 'Post' left outer join tags on tags.id = taggings.tag_id WHERE (tags.name in ('Very good'))  + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 1) LIMIT 1 + Post Load (0.000000) SELECT DISTINCT posts.* FROM posts left outer join taggings on taggings.taggable_id = posts.id and taggings.taggable_type = 'Post' left outer join tags on tags.id = taggings.tag_id WHERE (tags.name in ('Very good'))  + Photo Load (0.000000) SELECT * FROM photos WHERE (photos.id = 1) LIMIT 1 + Photo Load (0.000000) SELECT * FROM photos WHERE (photos.id = 4) LIMIT 1 + Photo Load (0.000000) SELECT * FROM photos WHERE (photos.id = 5) LIMIT 1 + Photo Load (0.000000) SELECT DISTINCT photos.* FROM photos left outer join taggings on taggings.taggable_id = photos.id and taggings.taggable_type = 'Photo' left outer join tags on tags.id = taggings.tag_id WHERE (tags.name in ('Nature'))  + Photo Load (0.000000) SELECT DISTINCT photos.* FROM photos left outer join taggings on taggings.taggable_id = photos.id and taggings.taggable_type = 'Photo' left outer join tags on tags.id = taggings.tag_id WHERE (tags.name in ('Nature'))  + Photo Load (0.016000) SELECT DISTINCT photos.* FROM photos left outer join taggings on taggings.taggable_id = photos.id and taggings.taggable_type = 'Photo' left outer join tags on tags.id = taggings.tag_id WHERE (tags.name in ('Nature'))  + Photo Load (0.000000) SELECT DISTINCT photos.* FROM photos left outer join taggings on taggings.taggable_id = photos.id and taggings.taggable_type = 'Photo' left outer join tags on tags.id = taggings.tag_id WHERE (tags.name in ('Nature'))  + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 3) LIMIT 1 + Photo Load (0.000000) SELECT DISTINCT photos.* FROM photos left outer join taggings on taggings.taggable_id = photos.id and taggings.taggable_type = 'Photo' left outer join tags on tags.id = taggings.tag_id WHERE (tags.name in ('Nature'))  + Photo Load (0.000000) SELECT * FROM photos WHERE (photos.id = 3) LIMIT 1 + Photo Load (0.000000) SELECT * FROM photos WHERE (photos.id = 2) LIMIT 1 + Photo Load (0.000000) SELECT DISTINCT photos.* FROM photos left outer join taggings on taggings.taggable_id = photos.id and taggings.taggable_type = 'Photo' left outer join tags on tags.id = taggings.tag_id WHERE (tags.name in ('Crazy animal','Bad'))  + Photo Load (0.000000) SELECT DISTINCT photos.* FROM photos left outer join taggings on taggings.taggable_id = photos.id and taggings.taggable_type = 'Photo' left outer join tags on tags.id = taggings.tag_id WHERE (tags.name in ('Crazy animal','Bad'))  + Photo Load (0.000000) SELECT DISTINCT photos.* FROM photos left outer join taggings on taggings.taggable_id = photos.id and taggings.taggable_type = 'Photo' left outer join tags on tags.id = taggings.tag_id WHERE (tags.name in ('Crazy animal','Bad'))  + Photo Load (0.000000) SELECT DISTINCT photos.* FROM photos left outer join taggings on taggings.taggable_id = photos.id and taggings.taggable_type = 'Photo' left outer join tags on tags.id = taggings.tag_id WHERE (tags.name in ('Crazy animal','Bad'))  + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 5) LIMIT 1 + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 2) LIMIT 1 + Photo Load (0.000000) SELECT DISTINCT photos.* FROM photos left outer join taggings on taggings.taggable_id = photos.id and taggings.taggable_type = 'Photo' left outer join tags on tags.id = taggings.tag_id WHERE (tags.name in ('Crazy animal','Bad'))  + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + Post Load (0.000000) SELECT DISTINCT posts.* FROM posts left outer join taggings on taggings.taggable_id = posts.id and taggings.taggable_type = 'Post' left outer join tags on tags.id = taggings.tag_id WHERE (tags.name in ('ABCDEFG'))  + Photo Load (0.000000) SELECT DISTINCT photos.* FROM photos left outer join taggings on taggings.taggable_id = photos.id and taggings.taggable_type = 'Photo' left outer join tags on tags.id = taggings.tag_id WHERE (tags.name in ('HIJKLM'))  + Photo Load (0.000000) SELECT DISTINCT photos.* FROM photos left outer join taggings on taggings.taggable_id = photos.id and taggings.taggable_type = 'Photo' left outer join tags on tags.id = taggings.tag_id WHERE (tags.name in ('unsaved tag'))  + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + Photo Load (0.000000) SELECT * FROM photos WHERE (photos.id = 2) LIMIT 1 + Tag Load (0.000000) SELECT tags.* FROM tags INNER JOIN taggings ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 2 AND taggings.taggable_type = 'Photo')  + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + Post Load (0.000000) SELECT * FROM posts WHERE (posts.id = 3) LIMIT 1 + Tag Load (0.000000) SELECT tags.* FROM tags INNER JOIN taggings ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 3 AND taggings.taggable_type = 'Post')  + Post Update (0.000000) UPDATE posts SET `text` = 'Why does the rain fall?', `user_id` = 1 WHERE id = 3 + Tagging Load Including Associations (0.000000) SELECT taggings.`id` AS t0_r0, taggings.`tag_id` AS t0_r1, taggings.`taggable_id` AS t0_r2, taggings.`taggable_type` AS t0_r3, taggings.`created_at` AS t0_r4, tags.`id` AS t1_r0, tags.`name` AS t1_r1 FROM taggings LEFT OUTER JOIN tags ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 3 AND taggings.taggable_type = 'Post')  + Tag Load (0.000000) SELECT tags.* FROM tags INNER JOIN taggings ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 3 AND taggings.taggable_type = 'Post')  + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + Post Load (0.000000) SELECT * FROM posts WHERE (posts.id = 1) LIMIT 1 + Tag Load (0.000000) SELECT tags.* FROM tags INNER JOIN taggings ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 1 AND taggings.taggable_type = 'Post')  + Post Update (0.000000) UPDATE posts SET `text` = 'The sky is particularly blue today', `user_id` = 1 WHERE id = 1 + Tagging Load Including Associations (0.016000) SELECT taggings.`id` AS t0_r0, taggings.`tag_id` AS t0_r1, taggings.`taggable_id` AS t0_r2, taggings.`taggable_type` AS t0_r3, taggings.`created_at` AS t0_r4, tags.`id` AS t1_r0, tags.`name` AS t1_r1 FROM taggings LEFT OUTER JOIN tags ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 1 AND taggings.taggable_type = 'Post')  + Tagging Delete all (0.000000) DELETE FROM taggings WHERE (id in (1))  + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.`name` = 'Beautiful' ) LIMIT 1 + SQL (0.000000) INSERT INTO tags (`name`) VALUES('Beautiful') + SQL (0.000000) INSERT INTO taggings (`tag_id`, `taggable_type`, `taggable_id`, `created_at`) VALUES(8, 'Post', 1, '2006-09-21 23:37:53') + Tag Load (0.000000) SELECT tags.* FROM tags INNER JOIN taggings ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 1 AND taggings.taggable_type = 'Post')  + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + Post Load (0.000000) SELECT * FROM posts WHERE (posts.id = 1) LIMIT 1 + Tag Load (0.000000) SELECT tags.* FROM tags INNER JOIN taggings ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 1 AND taggings.taggable_type = 'Post')  + Post Update (0.000000) UPDATE posts SET `text` = 'The sky is particularly blue today', `user_id` = 1 WHERE id = 1 + Tagging Load Including Associations (0.000000) SELECT taggings.`id` AS t0_r0, taggings.`tag_id` AS t0_r1, taggings.`taggable_id` AS t0_r2, taggings.`taggable_type` AS t0_r3, taggings.`created_at` AS t0_r4, tags.`id` AS t1_r0, tags.`name` AS t1_r1 FROM taggings LEFT OUTER JOIN tags ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 1 AND taggings.taggable_type = 'Post')  + Tagging Delete all (0.000000) DELETE FROM taggings WHERE (id in (1))  + Tag Load (0.000000) SELECT tags.* FROM tags INNER JOIN taggings ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 1 AND taggings.taggable_type = 'Post')  + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + User Load (0.000000) SELECT * FROM users WHERE (users.id = 1) LIMIT 1 + User Columns (0.000000) SHOW FIELDS FROM users + Post Load (0.000000) SELECT * FROM posts WHERE (posts.user_id = 1)  + Tag Load (0.000000)  select tags.id, tags.name, count(*) as count + from tags left outer join taggings on tags.id = taggings.tag_id + left outer join posts on posts.id = taggings.taggable_id + where taggings.taggable_type = "Post" + and posts.user_id = 1 + group by tags.id + having count(*) > 0 + + + + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 1) LIMIT 1 + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 4) LIMIT 1 + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 3) LIMIT 1 + User Load (0.000000) SELECT * FROM users WHERE (users.id = 2) LIMIT 1 + Post Load (0.000000) SELECT * FROM posts WHERE (posts.user_id = 2)  + Tag Load (0.000000)  select tags.id, tags.name, count(*) as count + from tags left outer join taggings on tags.id = taggings.tag_id + left outer join posts on posts.id = taggings.taggable_id + where taggings.taggable_type = "Post" + and posts.user_id = 2 + group by tags.id + having count(*) > 0 + + + + Tag Load (0.016000) SELECT * FROM tags WHERE (tags.id = 2) LIMIT 1 + Photo Load (0.000000) SELECT * FROM photos WHERE (photos.user_id = 1)  + Tag Load (0.000000)  select tags.id, tags.name, count(*) as count + from tags left outer join taggings on tags.id = taggings.tag_id + left outer join photos on photos.id = taggings.taggable_id + where taggings.taggable_type = "Photo" + and photos.user_id = 1 + group by tags.id + having count(*) > 0 + + + + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 5) LIMIT 1 + Photo Load (0.000000) SELECT * FROM photos WHERE (photos.user_id = 2)  + Tag Load (0.000000)  select tags.id, tags.name, count(*) as count + from tags left outer join taggings on tags.id = taggings.tag_id + left outer join photos on photos.id = taggings.taggable_id + where taggings.taggable_type = "Photo" + and photos.user_id = 2 + group by tags.id + having count(*) > 0 + + + + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + User Load (0.000000) SELECT * FROM users WHERE (users.id = 1) LIMIT 1 + Post Load (0.000000) SELECT * FROM posts WHERE (posts.user_id = 1)  + Tag Load (0.000000)  select tags.id, tags.name, count(*) as count + from tags left outer join taggings on tags.id = taggings.tag_id + left outer join posts on posts.id = taggings.taggable_id + where taggings.taggable_type = "Post" + and 1=0 and posts.user_id = 1 + group by tags.id + having count(*) > 0 + + + + Tag Load (0.000000)  select tags.id, tags.name, count(*) as count + from tags left outer join taggings on tags.id = taggings.tag_id + left outer join posts on posts.id = taggings.taggable_id + where taggings.taggable_type = "Post" + and posts.user_id = 1 + group by tags.id + having count(*) > 0 and count <= 2 + + + + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 1) LIMIT 1 + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 4) LIMIT 1 + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + Tag Load (0.000000)  select tags.id, tags.name, count(*) as count + from tags left outer join taggings on tags.id = taggings.tag_id + left outer join posts on posts.id = taggings.taggable_id + where taggings.taggable_type = "Post" + and taggings.created_at >= '2006-08-04' + group by tags.id + having count(*) > 0 + + + + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 1) LIMIT 1 + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 4) LIMIT 1 + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 2) LIMIT 1 + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 3) LIMIT 1 + Tag Load (0.000000)  select tags.id, tags.name, count(*) as count + from tags left outer join taggings on tags.id = taggings.tag_id + left outer join posts on posts.id = taggings.taggable_id + where taggings.taggable_type = "Post" + and taggings.created_at <= '2006-08-06' + group by tags.id + having count(*) > 0 + + + + Tag Load (0.000000)  select tags.id, tags.name, count(*) as count + from tags left outer join taggings on tags.id = taggings.tag_id + left outer join posts on posts.id = taggings.taggable_id + where taggings.taggable_type = "Post" + and taggings.created_at >= '2006-08-05' and taggings.created_at <= '2006-08-08' + group by tags.id + having count(*) > 0 + + + + Tag Load (0.000000)  select tags.id, tags.name, count(*) as count + from tags left outer join taggings on tags.id = taggings.tag_id + left outer join photos on photos.id = taggings.taggable_id + where taggings.taggable_type = "Photo" + and taggings.created_at >= '2006-08-12' and taggings.created_at <= '2006-08-17' + group by tags.id + having count(*) > 0 + + + + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 5) LIMIT 1 + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + Tag Load (0.000000)  select tags.id, tags.name, count(*) as count + from tags left outer join taggings on tags.id = taggings.tag_id + left outer join photos on photos.id = taggings.taggable_id + where taggings.taggable_type = "Photo" + + group by tags.id + having count(*) > 0 and count >= 2 + + + + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 5) LIMIT 1 + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 3) LIMIT 1 + Tag Load (0.000000)  select tags.id, tags.name, count(*) as count + from tags left outer join taggings on tags.id = taggings.tag_id + left outer join photos on photos.id = taggings.taggable_id + where taggings.taggable_type = "Photo" + + group by tags.id + having count(*) > 0 and count <= 2 + + + + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 1) LIMIT 1 + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 4) LIMIT 1 + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 2) LIMIT 1 + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + Tag Load (0.000000)  select tags.id, tags.name, count(*) as count + from tags left outer join taggings on tags.id = taggings.tag_id + left outer join photos on photos.id = taggings.taggable_id + where taggings.taggable_type = "Photo" + + group by tags.id + having count(*) > 0 + + limit 2 + + Tag Load (0.000000)  select tags.id, tags.name, count(*) as count + from tags left outer join taggings on tags.id = taggings.tag_id + left outer join posts on posts.id = taggings.taggable_id + where taggings.taggable_type = "Post" + + group by tags.id + having count(*) > 0 and count >= 4 + + limit 2 + + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 3) LIMIT 1 + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 1) LIMIT 1 + Tag Load (0.000000)  select tags.id, tags.name, count(*) as count + from tags left outer join taggings on tags.id = taggings.tag_id + left outer join posts on posts.id = taggings.taggable_id + where taggings.taggable_type = "Post" + + group by tags.id + having count(*) > 0 + order by count desc + limit 2 + + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + Post Load (0.015000) SELECT * FROM posts WHERE (posts.id = 1) LIMIT 1 + Tag Load (0.000000) SELECT tags.* FROM tags INNER JOIN taggings ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 1 AND taggings.taggable_type = 'Post')  + Photo Load (0.000000) SELECT * FROM photos WHERE (photos.id = 3) LIMIT 1 + Tag Load (0.000000) SELECT tags.* FROM tags INNER JOIN taggings ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 3 AND taggings.taggable_type = 'Photo')  + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + Photo Load (0.000000) SELECT * FROM photos WHERE (photos.id = 2) LIMIT 1 + Tag Load (0.000000) SELECT tags.* FROM tags INNER JOIN taggings ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 2 AND taggings.taggable_type = 'Photo')  + Photo Load (0.000000) SELECT * FROM photos WHERE (photos.id = 2) LIMIT 1 + Tag Load (0.000000) SELECT tags.* FROM tags INNER JOIN taggings ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 2 AND taggings.taggable_type = 'Photo')  + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + Post Load (0.000000) SELECT * FROM posts WHERE (posts.id = 1) LIMIT 1 + Tag Load (0.000000) SELECT tags.* FROM tags INNER JOIN taggings ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 1 AND taggings.taggable_type = 'Post')  + Post Load (0.000000) SELECT * FROM posts WHERE (posts.id = 1) LIMIT 1 + Tag Load (0.000000) SELECT tags.* FROM tags INNER JOIN taggings ON tags.id = taggings.tag_id WHERE (taggings.taggable_id = 1 AND taggings.taggable_type = 'Post')  + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 1) LIMIT 1 + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 1) LIMIT 1 + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 1) LIMIT 1 + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 1) LIMIT 1 + Tagging Load (0.000000) SELECT * FROM taggings WHERE (taggings.tag_id = 1)  + Post Load (0.000000) SELECT * FROM posts WHERE (posts.id = 1) LIMIT 1 + Post Load (0.000000) SELECT * FROM posts WHERE (posts.id = 5) LIMIT 1 + Photo Load (0.000000) SELECT * FROM photos WHERE (photos.id = 4) LIMIT 1 + Post Load (0.000000) SELECT * FROM posts WHERE (posts.id = 2) LIMIT 1 + SQL (0.000000) INSERT INTO taggings (`tag_id`, `taggable_type`, `taggable_id`, `created_at`) VALUES(1, 'Post', 2, '2006-09-21 23:37:53') + Tagging Load (0.000000) SELECT * FROM taggings WHERE (taggings.tag_id = 1)  + Post Load (0.000000) SELECT * FROM posts WHERE (posts.id = 1) LIMIT 1 + Post Load (0.000000) SELECT * FROM posts WHERE (posts.id = 5) LIMIT 1 + Photo Load (0.000000) SELECT * FROM photos WHERE (photos.id = 4) LIMIT 1 + Post Load (0.000000) SELECT * FROM posts WHERE (posts.id = 2) LIMIT 1 + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + Post Load (0.000000) SELECT * FROM posts WHERE (posts.id = 1) LIMIT 1 + Post Load (0.000000) SELECT * FROM posts WHERE (posts.id = 5) LIMIT 1 + Photo Load (0.000000) SELECT * FROM photos WHERE (photos.id = 4) LIMIT 1 + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 1) LIMIT 1 + Tagging Load (0.000000) SELECT * FROM taggings WHERE (taggings.tag_id = 1)  + Post Load (0.000000) SELECT * FROM posts WHERE (posts.id = 1) LIMIT 1 + Post Load (0.000000) SELECT * FROM posts WHERE (posts.id = 5) LIMIT 1 + Photo Load (0.000000) SELECT * FROM photos WHERE (photos.id = 4) LIMIT 1 + Post Load (0.000000) SELECT * FROM posts WHERE (posts.id = 4) LIMIT 1 + Photo Load (0.000000) SELECT * FROM photos WHERE (photos.id = 3) LIMIT 1 + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 2) LIMIT 1 + Tagging Load (0.000000) SELECT * FROM taggings WHERE (taggings.tag_id = 2)  + Post Load (0.015000) SELECT * FROM posts WHERE (posts.id = 4) LIMIT 1 + Photo Load (0.000000) SELECT * FROM photos WHERE (photos.id = 3) LIMIT 1 + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + Tagging Load (0.000000) SELECT * FROM taggings WHERE (taggings.id = 1) LIMIT 1 + Tagging Load (0.000000) SELECT * FROM taggings WHERE (taggings.id = 8) LIMIT 1 + Tagging Load (0.000000) SELECT * FROM taggings WHERE (taggings.id = 17) LIMIT 1 + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 1) LIMIT 1 + Tagging Load (0.000000) SELECT * FROM taggings WHERE (taggings.tag_id = 1)  + Tagging Load (0.000000) SELECT * FROM taggings WHERE (taggings.id = 7) LIMIT 1 + Tagging Load (0.000000) SELECT * FROM taggings WHERE (taggings.id = 14) LIMIT 1 + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 2) LIMIT 1 + Tagging Load (0.000000) SELECT * FROM taggings WHERE (taggings.tag_id = 2)  + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 1) LIMIT 1 + SQL (0.000000) ROLLBACK + SQL (0.000000) BEGIN + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 1) LIMIT 1 + Tagging Load (0.016000) SELECT * FROM taggings WHERE (taggings.id = 1) LIMIT 1 + Tag Load (0.000000) SELECT * FROM tags WHERE (tags.id = 1) LIMIT 1 + SQL (0.000000) ROLLBACK diff --git a/test/fixtures/photo.rb b/test/fixtures/photo.rb new file mode 100644 index 0000000..224957f --- /dev/null +++ b/test/fixtures/photo.rb @@ -0,0 +1,8 @@ +class Photo < ActiveRecord::Base + acts_as_taggable + + belongs_to :user +end + +class SpecialPhoto < Photo +end diff --git a/test/fixtures/photos.yml b/test/fixtures/photos.yml new file mode 100644 index 0000000..25a4118 --- /dev/null +++ b/test/fixtures/photos.yml @@ -0,0 +1,24 @@ +jonathan_dog: + id: 1 + user_id: 1 + title: A small dog + +jonathan_questioning_dog: + id: 2 + user_id: 1 + title: What does this dog want? + +jonathan_bad_cat: + id: 3 + user_id: 1 + title: Bad cat + +sam_flower: + id: 4 + user_id: 2 + title: Flower + +sam_sky: + id: 5 + user_id: 2 + title: Sky diff --git a/test/fixtures/post.rb b/test/fixtures/post.rb new file mode 100644 index 0000000..bee100a --- /dev/null +++ b/test/fixtures/post.rb @@ -0,0 +1,7 @@ +class Post < ActiveRecord::Base + acts_as_taggable + + belongs_to :user + + validates_presence_of :text +end diff --git a/test/fixtures/posts.yml b/test/fixtures/posts.yml new file mode 100644 index 0000000..d0cd9ac --- /dev/null +++ b/test/fixtures/posts.yml @@ -0,0 +1,24 @@ +jonathan_sky: + id: 1 + user_id: 1 + text: The sky is particularly blue today + +jonathan_grass: + id: 2 + user_id: 1 + text: The grass seems very green + +jonathan_rain: + id: 3 + user_id: 1 + text: Why does the rain fall? + +sam_ground: + id: 4 + user_id: 2 + text: The ground is looking too brown + +sam_flowers: + id: 5 + user_id: 2 + text: Why are the flowers dead? \ No newline at end of file diff --git a/test/fixtures/taggings.yml b/test/fixtures/taggings.yml new file mode 100644 index 0000000..b6eb440 --- /dev/null +++ b/test/fixtures/taggings.yml @@ -0,0 +1,126 @@ +jonathan_sky_good: + id: 1 + tag_id: 1 + taggable_id: 1 + taggable_type: Post + created_at: 2006-08-01 + +jonathan_sky_nature: + id: 2 + tag_id: 3 + taggable_id: 1 + taggable_type: Post + created_at: 2006-08-02 + +jonathan_grass_nature: + id: 3 + tag_id: 3 + taggable_id: 2 + taggable_type: Post + created_at: 2006-08-03 + +jonathan_rain_question: + id: 4 + tag_id: 4 + taggable_id: 3 + taggable_type: Post + created_at: 2006-08-04 + +jonathan_rain_nature: + id: 5 + tag_id: 3 + taggable_id: 3 + taggable_type: Post + created_at: 2006-08-05 + +sam_ground_nature: + id: 6 + tag_id: 3 + taggable_id: 4 + taggable_type: Post + created_at: 2006-08-06 + +sam_ground_bad: + id: 7 + tag_id: 2 + taggable_id: 4 + taggable_type: Post + created_at: 2006-08-07 + +sam_flowers_good: + id: 8 + tag_id: 1 + taggable_id: 5 + taggable_type: Post + created_at: 2006-08-08 + +sam_flowers_nature: + id: 9 + tag_id: 3 + taggable_id: 5 + taggable_type: Post + created_at: 2006-08-09 + + +jonathan_dog_animal: + id: 10 + tag_id: 5 + taggable_id: 1 + taggable_type: Photo + created_at: 2006-08-10 + +jonathan_dog_nature: + id: 11 + tag_id: 3 + taggable_id: 1 + taggable_type: Photo + created_at: 2006-08-11 + +jonathan_questioning_dog_animal: + id: 12 + tag_id: 5 + taggable_id: 2 + taggable_type: Photo + created_at: 2006-08-12 + +jonathan_questioning_dog_question: + id: 13 + tag_id: 4 + taggable_id: 2 + taggable_type: Photo + created_at: 2006-08-13 + +jonathan_bad_cat_bad: + id: 14 + tag_id: 2 + taggable_id: 3 + taggable_type: Photo + created_at: 2006-08-14 + +jonathan_bad_cat_animal: + id: 15 + tag_id: 5 + taggable_id: 3 + taggable_type: Photo + created_at: 2006-08-15 + +sam_flower_nature: + id: 16 + tag_id: 3 + taggable_id: 4 + taggable_type: Photo + created_at: 2006-08-16 + +sam_flower_good: + id: 17 + tag_id: 1 + taggable_id: 4 + taggable_type: Photo + created_at: 2006-08-17 + +sam_sky_nature: + id: 18 + tag_id: 3 + taggable_id: 5 + taggable_type: Photo + created_at: 2006-08-18 diff --git a/test/fixtures/tags.yml b/test/fixtures/tags.yml new file mode 100644 index 0000000..b8f8367 --- /dev/null +++ b/test/fixtures/tags.yml @@ -0,0 +1,19 @@ +good: + id: 1 + name: Very good + +bad: + id: 2 + name: Bad + +nature: + id: 3 + name: Nature + +question: + id: 4 + name: Question + +animal: + id: 5 + name: Crazy animal \ No newline at end of file diff --git a/test/fixtures/user.rb b/test/fixtures/user.rb new file mode 100644 index 0000000..ac9c423 --- /dev/null +++ b/test/fixtures/user.rb @@ -0,0 +1,4 @@ +class User < ActiveRecord::Base + has_many :posts, :extend => TagCountsExtension + has_many :photos, :extend => TagCountsExtension +end diff --git a/test/fixtures/users.yml b/test/fixtures/users.yml new file mode 100644 index 0000000..da94fea --- /dev/null +++ b/test/fixtures/users.yml @@ -0,0 +1,7 @@ +jonathan: + id: 1 + name: Jonathan + +sam: + id: 2 + name: Sam diff --git a/test/schema.rb b/test/schema.rb new file mode 100644 index 0000000..0891650 --- /dev/null +++ b/test/schema.rb @@ -0,0 +1,26 @@ +ActiveRecord::Schema.define :version => 0 do + create_table :tags, :force => true do |t| + t.column :name, :string + end + + create_table :taggings, :force => true do |t| + t.column :tag_id, :integer + t.column :taggable_id, :integer + t.column :taggable_type, :string + t.column :created_at, :datetime + end + + create_table :users, :force => true do |t| + t.column :name, :string + end + + create_table :posts, :force => true do |t| + t.column :text, :text + t.column :user_id, :integer + end + + create_table :photos, :force => true do |t| + t.column :title, :string + t.column :user_id, :integer + end +end diff --git a/test/tag_test.rb b/test/tag_test.rb new file mode 100644 index 0000000..0ac5a88 --- /dev/null +++ b/test/tag_test.rb @@ -0,0 +1,74 @@ +require File.dirname(__FILE__) + '/abstract_unit' + +class TagTest < Test::Unit::TestCase + fixtures :tags, :taggings, :users, :photos, :posts + + def test_taggings + assert_equal [taggings(:jonathan_sky_good), taggings(:sam_flowers_good), taggings(:sam_flower_good)], tags(:good).taggings + assert_equal [taggings(:sam_ground_bad), taggings(:jonathan_bad_cat_bad)], tags(:bad).taggings + end + + def test_tagged + assert_equal [posts(:jonathan_sky), posts(:sam_flowers), photos(:sam_flower)], tags(:good).tagged + assert_equal [posts(:sam_ground), photos(:jonathan_bad_cat)], tags(:bad).tagged + end + + def test_tag + assert !tags(:good).tagged.include?(posts(:jonathan_grass)) + tags(:good).tag(posts(:jonathan_grass)) + assert tags(:good).tagged.include?(posts(:jonathan_grass)) + end + + def test_parse_leaves_string_unchanged + tags = '"One ", Two' + original = tags.dup + Tag.parse(tags) + assert_equal tags, original + end + + def test_parse_single_tag + assert_equal %w{Fun}, Tag.parse("Fun") + assert_equal %w{Fun}, Tag.parse('"Fun"') + end + + def test_parse_blank + assert_equal [], Tag.parse(nil) + assert_equal [], Tag.parse("") + end + + def test_parse_single_quoted_tag + assert_equal ['with, comma'], Tag.parse('"with, comma"') + end + + def test_spaces_do_not_delineate + assert_equal ['A B', 'C'], Tag.parse('A B, C') + end + + def test_parse_multiple_tags + assert_equivalent %w{Alpha Beta Delta Gamma}, Tag.parse("Alpha, Beta, Gamma, Delta").sort + end + + def test_parse_multiple_tags_with_quotes + assert_equivalent %w{Alpha Beta Delta Gamma}, Tag.parse('Alpha, "Beta", Gamma , "Delta"').sort + end + + def test_parse_multiple_tags_with_quote_and_commas + assert_equivalent ['Alpha, Beta', 'Delta', 'Gamma, something'], Tag.parse('"Alpha, Beta", Delta, "Gamma, something"') + end + + def test_parse_removes_white_space + assert_equivalent %w{Alpha Beta}, Tag.parse('" Alpha ", "Beta "') + assert_equivalent %w{Alpha Beta}, Tag.parse(' Alpha, Beta ') + end + + def test_to_s + assert_equal tags(:good).name, tags(:good).to_s + end + + def test_equality + assert_equal tags(:good), tags(:good) + assert_equal Tag.find(1), Tag.find(1) + assert_equal Tag.new(:name => 'A'), Tag.new(:name => 'A') + assert_not_equal Tag.new(:name => 'A'), Tag.new(:name => 'B') + end +end diff --git a/test/tagging_test.rb b/test/tagging_test.rb new file mode 100644 index 0000000..3b7bf55 --- /dev/null +++ b/test/tagging_test.rb @@ -0,0 +1,9 @@ +require File.dirname(__FILE__) + '/abstract_unit' + +class TaggingTest < Test::Unit::TestCase + fixtures :tags, :taggings + + def test_tag + assert_equal tags(:good), taggings(:jonathan_sky_good).tag + end +end