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
-~----------~----~----~----~------~----~------~--~---

Reply via email to