Matt, I see what you are saying about the #count call, and why it doesn't make sense in the context of only having :include specified. But I actually do have a :conditions passed into the #count method, since my users need to search on those associated classes (Ex: searching for a particular PipingClass that is tied to a ModelLoggings record). The count method is really just for pagination purposes.
I like your idea for only grabbing the id's though, that's a much cleaner way to do that find call. I really should take the plunge into Rails' internals and submit a patch, although I have high regard for my sanity :) Regards, Adam -- Adam Grant Lead Web Engineer Telaeris, Inc. [email protected] (858) 627-9710 On Thu, Aug 6, 2009 at 3:59 PM, Matt Aimonetti <[email protected]>wrote: > > > On Thu, Aug 6, 2009 at 3:47 PM, Adam Grant <[email protected]> wrote: > >> Thanks for the quick reply Matt, >> >> I tried :joins => [:model] instead of :include => [:model], but I get the >> same error. > > > I should try something like: :joins => "LEFT JOIN jobs on jobs.person_id > = person.id") > > But wait, I'm confused, why are you trying to use an include statement? > Aren't you trying to find all the ModelLogging records? > ModelLogging.count(:include => [:model]) > By using an include, you are trying to load all the models related to the > ModelLogging records, but why do you need them to be loaded to count? > > > > >> >> The actual #count call does have a conditions statement in there, but I >> left it out for brevity. I've tried both ways, but they produce the same >> error. I am hesitant to use #count_by_sql, since someone might search for a >> value that is in one of the associated models, and I would have to construct >> those joins and conditions myself, which can get messy. PipingClass is not >> the only model that will be linked to ModelLoggings. > > > Worst case scenario, you can write a wrapper around count_by_sql. > > > >> >> >> I've search through the restricted keywords for "model", but I didnt' find >> any reference that it could pose a problem. I dismissed it as a non-issue >> because of that lighthouse ticket someone else put up with the same problem >> I am having. I understand it is a bad practice anywho, so I will take your >> suggestion nonetheless. Do you know of an actual issue this could pose? (The >> "Rails restricted keywords" articles I've looked at are a bit dated). I'm >> curious. > > > I don't know for sure, I would have to look at the AR's internals. It might > be fine. > > >> >> >> For now, I am using the #find call, leaving out the limit, and then taking >> the size of the resulting array (UGLY). This isn't going into heavy use >> right away, so this hack will work for the time being until I get around to >> submitting that test to Rails' Lighthouse. > > > At least, only load the id field so the query will run faster. > I doubt AR will easily support eager loading on polymorphic associations > since you need to build a pretty complicated query. But I might be wrong. > > >> >> >> In case people are wondering: >> >> $ ./script/about >> >> About your application's environment >> Ruby version 1.8.6 (i686-linux) >> RubyGems version 1.3.1 >> Rack version 1.0 >> Rails version 2.3.2 >> Active Record version 2.3.2 >> Action Pack version 2.3.2 >> Active Resource version 2.3.2 >> Action Mailer version 2.3.2 >> Active Support version 2.3.2 >> Environment development >> Database adapter mysql >> >> Thanks! >> -- >> Adam Grant >> Lead Web Engineer >> Telaeris, Inc. >> [email protected] >> (858) 627-9710 >> >> >> On Thu, Aug 6, 2009 at 3:31 PM, Matt Aimonetti >> <[email protected]>wrote: >> >>> Hmm "belongs_to :model, :polymorphic => true" <-- using model has a >>> class/model name isn't recommended, as a work around I would use #count >>> passing a condition and/or a join or even directly use count_by_sql. >>> >>> - Matt >>> >>> >>> >>> On Thu, Aug 6, 2009 at 3:24 PM, Adam Grant <[email protected]>wrote: >>> >>>> Hi group! >>>> >>>> My question is this: Is there a way to turn of eager loading for a >>>> #count call on a model (ModelLogging.eager_loading = false ??), since that >>>> SEEMS to be my problem (#count doesn't seem to take the :preload option). >>>> >>>> The issue I have is with calling count on a Polymorphic model: >>>> >>>> class ModelLogging < ActiveRecord::Base >>>> belongs_to :model, :polymorphic => true >>>> end >>>> >>>> class PipingClass < ActiveRecord::Base >>>> has_many :model_loggings, :as => :model >>>> end >>>> >>>> The model_loggings table looks like: >>>> =============== >>>> create_table "model_loggings", :force => true do |t| >>>> t.string "model_type" >>>> t.integer "model_id" >>>> t.string "field_name" >>>> t.string "old_value" >>>> t.string "new_value" >>>> t.datetime "modified_at" >>>> t.integer "employee_id" >>>> t.datetime "created_at" >>>> t.datetime "updated_at" >>>> end >>>> ============== >>>> >>>> There is only one record in the model_loggings table: >>>> =============== >>>> #<ModelLogging id: 1, model_type: "PipingClass", model_id: 3331, >>>> field_name: "class_code", old_value: "BCA", new_value: "A", modified_at: >>>> "2009-08-06 11:55:44", employee_id: nil, created_at: "2009-08-06 11:55:44", >>>> updated_at: "2009-08-06 11:55:44"> >>>> =============== >>>> >>>> If I try the following, it works: >>>> =============== >>>> > ModelLogging.find(:all, :include => [:model]) >>>> => [#<ModelLogging id: 1, model_type: "PipingClass", model_id: 3331, >>>> field_name: "class_code", old_value: "BCA", new_value: "A", modified_at: >>>> "2009-08-06 11:55:44", employee_id: nil, created_at: "2009-08-06 11:55:44", >>>> updated_at: "2009-08-06 11:55:44">] >>>> >>>> > ModelLogging.count >>>> => 1 >>>> =============== >>>> >>>> But... >>>> =============== >>>> > ModelLogging.count(:include => [:model]) >>>> => ActiveRecord::EagerLoadPolymorphicError: Can not eagerly load the >>>> polymorphic association :model >>>> from >>>> /usr/local/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/associations.rb:1960:in >>>> `initialize' >>>> from >>>> /usr/local/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/associations.rb:1853:in >>>> `new' >>>> from >>>> /usr/local/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/associations.rb:1853:in >>>> `build_join_association' >>>> from >>>> /usr/local/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/associations.rb:1836:in >>>> `build' >>>> from >>>> /usr/local/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/associations.rb:1839:in >>>> `build' >>>> from >>>> /usr/local/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/associations.rb:1838:in >>>> `each' >>>> from >>>> /usr/local/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/associations.rb:1838:in >>>> `build' >>>> from >>>> /usr/local/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/associations.rb:1758:in >>>> `initialize' >>>> from >>>> /usr/local/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/calculations.rb:210:in >>>> `new' >>>> from >>>> /usr/local/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/calculations.rb:210:in >>>> `construct_calculation_sql' >>>> from >>>> /usr/local/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/calculations.rb:243:in >>>> `execute_simple_calculation' >>>> from >>>> /usr/local/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/calculations.rb:134:in >>>> `calculate' >>>> from >>>> /usr/local/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/calculations.rb:130:in >>>> `catch' >>>> from >>>> /usr/local/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/calculations.rb:130:in >>>> `calculate' >>>> from >>>> /usr/local/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/calculations.rb:48:in >>>> `count_without_trace_ActiveRecord___self_name__find' >>>> from >>>> /home/telaeris/sandbox/po_tracker_bpcherrypoint/vendor/plugins/newrelic_rpm/lib/new_relic/agent/method_tracer.rb:138:in >>>> `count_without_trace_ActiveRecord_find' >>>> ... 55 levels... >>>> from >>>> /usr/local/lib/ruby/gems/1.8/gems/rack-1.0.0/lib/rack/handler/mongrel.rb:61:in >>>> `process' >>>> from >>>> /usr/local/lib/ruby/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:159:in >>>> `process_client' >>>> from >>>> /usr/local/lib/ruby/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:158:in >>>> `each' >>>> from >>>> /usr/local/lib/ruby/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:158:in >>>> `process_client' >>>> from >>>> /usr/local/lib/ruby/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:285:in `run' >>>> from >>>> /usr/local/lib/ruby/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:285:in >>>> `initialize' >>>> from >>>> /usr/local/lib/ruby/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:285:in `new' >>>> from >>>> /usr/local/lib/ruby/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:285:in `run' >>>> from >>>> /usr/local/lib/ruby/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:268:in >>>> `initialize' >>>> from >>>> /usr/local/lib/ruby/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:268:in `new' >>>> from >>>> /usr/local/lib/ruby/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:268:in `run' >>>> from >>>> /usr/local/lib/ruby/gems/1.8/gems/rack-1.0.0/lib/rack/handler/mongrel.rb:34:in >>>> `run' >>>> from >>>> /home/telaeris/.gem/ruby/1.8/gems/rails-2.3.2/lib/commands/server.rb:111 >>>> from >>>> /usr/local/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in >>>> `gem_original_require' >>>> from >>>> /usr/local/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in >>>> `require' >>>> ================ >>>> >>>> Not sure what to do without diving into AR internals some more, >>>> something I don't really want to do. >>>> >>>> I've also found this ticket, but no action has really happened on it. I >>>> am pondering submitting a failing test case for it if I can't think of >>>> another way around this: >>>> >>>> >>>> https://rails.lighthouseapp.com/projects/8994/tickets/1166-count-works-differently-than-find-with-polymorphic-include >>>> >>>> Any thoughts? >>>> >>>> PS: I should be at tonight's meeting, and I am pushing to attend the >>>> RBBQ, but I may be fishing for longer than expected that day. >>>> >>>> Thanks! >>>> >>>> -- >>>> Adam Grant >>>> Lead Web Engineer >>>> Telaeris, Inc. >>>> [email protected] >>>> (858) 627-9710 >>>> >>>> >>>> >>> >>> >>> >> >> >> > > > > --~--~---------~--~----~------------~-------~--~----~ SD Ruby mailing list [email protected] http://groups.google.com/group/sdruby -~----------~----~----~----~------~----~------~--~---
