Philip Hallstrom
2007-Feb-14  16:35 UTC
HABTM problem when using count() on the association (it then loads all the records too?)
Hi all -
Just ran into a strange problem on Rails 1.1.6 (if this is a 1.1.6 issue, 
stop me now and let me know :).
I''m running into an odd situation...
model.habtm_association.count => 1234 # this is okay and sql shows a
                                       # COUNT(*) query
However, if I now do model.inspect or save model into memcache, it loads 
up all of habtm_association and I''ve confirmed that by looking at the
SQL.
This happens both in the website and in the console (by just typing 
''model'' even).
Any idea why this is happening?  Here''s my models...
class GalleryCategory < ActiveRecord::Base
   has_and_belongs_to_many :video_gallery_entries,
     :join_table => :gallery_categories_gallery_entries,
     :association_foreign_key => :gallery_entry_id,
     :conditions => "gallery_entries.enabled = true AND
gallery_entries.type = ''VideoGalleryEntry''",
     :order => ''gallery_entries.created_at DESC'',
     :uniq => true
end
class GalleryEntry < ActiveRecord::Base
   has_and_belongs_to_many :gallery_categories,
     :join_table => :gallery_categories_gallery_entries,
     :foreign_key => :gallery_entry_id,
     :order => ''gallery_categories.name'',
     :uniq => true
end
class VideoGalleryEntry < GalleryEntry
end
The steps to cause this problem along with the SQL generated are:
>> c = GalleryCategory.find(:first)=> #<GalleryCategory:0x326bb48
>> @attributes={"name"=>"Games and Gadgets",
"id"=>"5", "blurb"=>""}>
SELECT * FROM gallery_categories LIMIT 1
>> c.video_gallery_entries.count
=> 1
  SELECT count(*) AS count_all FROM gallery_entries INNER JOIN
gallery_categories_gallery_entries ON gallery_entries.id
gallery_categories_gallery_entries.gallery_entry_id WHERE
(gallery_categories_gallery_entries.gallery_category_id = 5 AND
(gallery_entries.enabled = true AND gallery_entries.type
''VideoGalleryEntry'')) AND ( (gallery_entries.`type`
''VideoGalleryEntry'' ) )
(this is where things get weird... below I just type ''c'', but
within my
website if I do c.inspect or save c into memcache the same thing
happens)
>> c
=> #<GalleryCategory:0x326bb48
@attributes={"name"=>"Games and Gadgets",
"id"=>"5", "blurb"=>""},
@video_gallery_entries=[#<VideoGalleryEntry:0x31c7250
@attributes={"event_id"=>"0",
"updated_at"=>"2007-02-13 02:30:34",
"featured"=>"1",
"event_day_id"=>"0",
"gallery_category_id"=>"5",
"type"=>"VideoGalleryEntry",
"tournament_location_id"=>nil,
"enabled"=>"1", "id"=>"22840",
"tournament_id"=>"0",
"position"=>"10",
"gallery_entry_id"=>"22840",
"created_at"=>"2007-02-12 06:25:06"}>]>
SELECT * FROM gallery_entries INNER JOIN
gallery_categories_gallery_entries ON gallery_entries.id
gallery_categories_gallery_entries.gallery_entry_id WHERE
(gallery_categories_gallery_entries.gallery_category_id = 5 AND
(gallery_entries.enabled = true AND gallery_entries.type
''VideoGalleryEntry'')) AND ( (gallery_entries.`type`
''VideoGalleryEntry'' ) ) ORDER BY gallery_entries.created_at
DESC
Can someone shed some light on why this is happening?  I''m thinking
that
by calling count() I''ve created a stub for the association so when I
inspect it or save it memcache it sees that and figures it needs to load
it up since it isn''t already?
Thanks for any pointers!
-philip
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Ruby on Rails: Talk" group.
To post to this group, send email to
rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
To unsubscribe from this group, send email to
rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
For more options, visit this group at
http://groups.google.com/group/rubyonrails-talk?hl=en
-~----------~----~----~----~------~----~------~--~---