Wow, that's a great explanation Matt. I was not aware of the subtle
differences.

It sounds like a sensible default would be to use `size`, unless you know
you need a specific behaviour..?



On 1 October 2014 03:03, Matt Jones <al2o...@gmail.com> wrote:

>
>
> On Monday, 29 September 2014 23:15:36 UTC-4, Austin York wrote:
>>
>> In a todo list-style app, I have the following ActiveRecord model method:
>>
>> class Task < ActiveRecord::Base
>>   # ...
>>   def project_name
>>     project.tasks.length > 0 ? "#{project.name} - #{name}" : project.name
>>   end
>> end
>>
>> The idea is to provide additional project information if there are one or
>> more tasks on the project.
>>
>> However, when invoked regularly on views this creates performance
>> concerns (especially with a growing data set).
>>
>> What is the best way to optimize this query so that it doesn't create N+1
>> query type issues when invoked from "each" loops in the view?
>>
>
> +1 what MichaƂ said about eager-loading. One additional tricky thing:
> prefer `size` over `length` for associations and relations. In plain Ruby,
> `size`, `length` and `count` are more or less identical - but for
> ActiveRecord collections they have slightly different meanings:
>
> * `length` is the most straightforward: it's ALWAYS the number of records
> in the collection. If the collection isn't currently loaded, calling
> `length` on it will trigger a SQL query to load all the records.
>
> * `count` is the opposite: it ALWAYS runs a SQL query. It doesn't load
> records, it uses SQL's `COUNT()` function. It can also return things that
> aren't numbers; doing `Task.group(:project_id).count` will give you back a
> hash with `project_id`s as keys and the number of matching tasks as values.
>
> * `size` is the middle: if the collection is loaded, it works like
> `length`. Otherwise it works like `count`...
>
> --Matt Jones
>
> --
> You received this message because you are subscribed to the Google Groups
> "Ruby on Rails: Talk" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to rubyonrails-talk+unsubscr...@googlegroups.com.
> To post to this group, send email to rubyonrails-talk@googlegroups.com.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/rubyonrails-talk/e6771c47-1c12-4e5a-8fe6-73af4d7b26e3%40googlegroups.com
> <https://groups.google.com/d/msgid/rubyonrails-talk/e6771c47-1c12-4e5a-8fe6-73af4d7b26e3%40googlegroups.com?utm_medium=email&utm_source=footer>
> .
>
> For more options, visit https://groups.google.com/d/optout.
>

-- 
You received this message because you are subscribed to the Google Groups "Ruby 
on Rails: Talk" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to rubyonrails-talk+unsubscr...@googlegroups.com.
To post to this group, send email to rubyonrails-talk@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/rubyonrails-talk/CABLJ1D%2B1A0ygjEfirVBO6dKxD453-54CinFaW%3D%3DrYrs4DkxNZQ%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to