Hi,
Sorry, you are correct, its the wrong log (new log in the bottom of the email) but I have made some progress, after some debugging I made the following test case (named two) where I save the document Object before I create the bookmarks associations what results in duplicate increment sql statements. But when I turn this around (creating bookmarks associations first before saving the document object) everything seems to work fine with the counter_cache triggers.
the following test case where the last assertion fails
def test_case_two
bookmark = {:title => "mytitle", :description=>"mydescription", :note=>"mynote"}
# save document before bookmarking
doc = Document.new
assert doc.save!
assert doc.bookmarks.create!(bookmark.merge!({:user_id => users(:user1).id}))
assert_equal 1, doc.bookmarks.count # fetch directly from database
assert_equal 0, doc.bookmarks.size # it hasn't retrieved the updated counter yet
assert doc.reload
assert_equal 1, doc.bookmarks.size # << THIS FAILS because doc.bookmarks.size return 2
end
the following output can be found in my testing log where you can see the update to both documents (as users) happens twice with + 1 (together 4 updates). There should be only one "UPDATE documents SET bookmarks_count = bookmarks_count + 1 WHERE (id = 22)" statement (and one "UPDATE users ... + 1".
my models again:
-- Document.rb:
class Document < ActiveRecord::Base
has_many :bookmarks, :as => :bookmarkable, :dependent => :destroy
end
-- Bookmark.rb:
class Bookmark < ActiveRecord::Base
# associations
belongs_to :bookmarkable, :polymorphic => true, :counter_cache => "bookmarks_count"
end
The following logs gets generated when I execute the test case (two) above:
e[4;36;1mSQL (0.000448)e[0m e[0;1mBEGINe[0m
e[4;35;1mSQL (0.000877)e[0m e[0mINSERT INTO documents (`created_on`, `name`, `updated_on`, `bookmarks_count`, `content`) VALUES('2006-12-26 22:47:46', NULL, '2006-12-26 22:47:46', 0, NULL)e[0m
e[4;36;1mSQL (0.000982)e[0m e[0;1mCOMMITe[0m
e[4;35;1mUser Load (0.001562)e[0m e[0mSELECT * FROM users WHERE (users.id = 1) e[0m
e[4;36;1mSQL (0.000505)e[0m e[0;1mBEGINe[0m
e[4;35;1mBookmark Load (0.002043)e[0m e[0mSELECT * FROM bookmarks WHERE (bookmarks.user_id = 1 AND bookmarks.bookmarkable_id = 22 AND bookmarks.bookmarkable_type = 'Document') LIMIT 1e[0m
e[4;36;1mBookmark Load (0.001914)e[0m e[0;1mSELECT * FROM bookmarks WHERE (bookmarks.user_id = 1 AND bookmarks.bookmarkable_id = 22 AND bookmarks.bookmarkable_type = 'Document') LIMIT 1e[0m
e[4;35;1mSQL (0.000876)e[0m e[0mINSERT INTO bookmarks (`bookmarkable_type`, `title`, `bookmarkable_id`, `description`, `note`, `user_id`) VALUES('Document', 'mytitle', 22, 'mydescription', 'mynote', 1)e[0m
e[4;36;1mDocument Load (0.001840)e[0m e[0;1mSELECT * FROM documents WHERE (documents.id = 22) e[0m
e[4;35;1mDocument Update (0.000869)e[0m e[0mUPDATE documents SET bookmarks_count = bookmarks_count + 1 WHERE (id = 22) e[0m
e[4;36;1mUser Load (0.001459)e[0m e[0;1mSELECT * FROM users WHERE (users.id = 1) e[0m
e[4;35;1mUser Update (0.001149)e[0m e[0mUPDATE users SET bookmarks_count = bookmarks_count + 1 WHERE (id = 1) e[0m
e[4;36;1mDocument Update (0.000796)e[0m e[0;1mUPDATE documents SET bookmarks_count = bookmarks_count + 1 WHERE (id = 22) e[0m
e[4;35;1mUser Update (0.000718)e[0m e[0mUPDATE users SET bookmarks_count = bookmarks_count + 1 WHERE (id = 1) e[0m
e[4;36;1mDocument Load Including Associations (0.004153)e[0m e[0;1mSELECT documents.`id` AS t0_r0, documents.`name` AS t0_r1, documents.`content` AS t0_r2, documents.`bookmarks_count` AS t0_r3, documents.`created_on` AS t0_r4, documents.`updated_on` AS t0_r5, bookmarks.`id` AS t1_r0, bookmarks.`bookmarkable_id` AS t1_r1, bookmarks.`bookmarkable_type` AS t1_r2, bookmarks.`user_id` AS t1_r3, bookmarks.`title` AS t1_r4, bookmarks.`description` AS t1_r5, bookmarks.`note` AS t1_r6 FROM documents LEFT OUTER JOIN bookmarks ON bookmarks.bookmarkable_id = documents.id AND bookmarks.bookmarkable_type = 'Document'WHERE (documents.id = 22) e[0m
e[4;35;1mTagging Columns (0.002069)e[0m e[0mSHOW FIELDS FROM taggingse[0m
e[4;36;1mTag Load (0.001298)e[0m e[0;1mSELECT tags.* FROM tags INNER JOIN taggings ON tags.id = taggings.tag_id WHERE ((taggings.taggable_type = 'Bookmark') AND (taggings.taggable_id = 29)) e[0m
e[4;35;1mTagging Load (0.002059)e[0m e[0mSELECT * FROM taggings WHERE (taggings.taggable_id = 22 AND taggings.taggable_type = 'Document') e[0m
e[4;36;1mDocument Load Including Associations (0.003034)e[0m e[0;1mSELECT documents.`id` AS t0_r0, documents.`name` AS t0_r1, documents.`content` AS t0_r2, documents.`bookmarks_count` AS t0_r3, documents.`created_on` AS t0_r4, documents.`updated_on` AS t0_r5, bookmarks.`id` AS t1_r0, bookmarks.`bookmarkable_id` AS t1_r1, bookmarks.`bookmarkable_type` AS t1_r2, bookmarks.`user_id` AS t1_r3, bookmarks.`title` AS t1_r4, bookmarks.`description` AS t1_r5, bookmarks.`note` AS t1_r6 FROM documents LEFT OUTER JOIN bookmarks ON bookmarks.bookmarkable_id = documents.id AND bookmarks.bookmarkable_type = 'Document'WHERE (documents.id = 22) e[0m
e[4;35;1mTag Load (0.001362)e[0m e[0mSELECT tags.* FROM tags INNER JOIN taggings ON tags.id = taggings.tag_id WHERE ((taggings.taggable_type = 'Bookmark') AND (taggings.taggable_id = 29)) e[0m
e[4;36;1mTagging Load (0.001654)e[0m e[0;1mSELECT * FROM taggings WHERE (taggings.taggable_id = 22 AND taggings.taggable_type = 'Document') e[0m
e[4;35;1mSQL (0.001052)e[0m e[0mCOMMITe[0m
e[4;36;1mSQL (0.001172)e[0m e[0;1mSELECT count(*) AS count_all FROM bookmarks WHERE (bookmarks.bookmarkable_id = 22 AND bookmarks.bookmarkable_type = 'Document') e[0m
e[4;35;1mDocument Load (0.001758)e[0m e[0mSELECT * FROM documents WHERE (documents.id = 22) e[0,