# Backwards N+1 problem

**URL:** <https://www.ruby-forum.com/t/backwards-n-1-problem/151929>\
**Category:** Rails\
**Created:** [October 28, 2008, 1:33am UTC](https://www.ruby-forum.com/t/backwards-n-1-problem/151929 "2008-10-28T01:33:36Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![indigoi](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/i/b3f665/32.png) [@indigoi](https://www.ruby-forum.com/u/indigoi)\
**Post date:** [October 28, 2008, 1:33am UTC](https://www.ruby-forum.com/t/backwards-n-1-problem/151929/1 "2008-10-28T01:33:36Z")

</div>

Hey, iâ€™m running into an N+1 problem, but i don’t exactly know how to  
:include in this situation. (controller code is at the bottom).

I’m trying to find all of the highest ranked definitions, and then  
render their associated phrases.

A Phrase has many definitions. A Definition has many children

I already have all the info i need stored in @definitions, so this  
should only require one SQL call, but unfortunately this line:

@Phrases \<\< definition.phrase(:include =\> [:definitions =\> :children])

Doesnâ€™t actually work.

Below is my controller code. Rails 2.1.0, Ruby 1.8.6â€¦Thanks ahead of  
time

def index  
@definitions = Definition.find(:all, :include =\> [:children,  
:phrase], :limit =\> 10, :order =\> ‘rank DESC’)  
@Phrases = []  
for definition in @definitions  
@Phrases \<\< definition.phrase(:include =\> [:definitions =\>  
:children])  
end  
@Phrases = @Phrases.uniq  
if @Phrases != nil  
@new\_phrases = @Phrases.paginate(:page =\> params[:page], :order  
=\> ‘word ASC’, :per\_page =\> 5)  
end ## if @phrase !=nil  
end ##def index

The full capture can be found under my Five Runs Account  
[https://tuneup.fiveruns.com/runs/699](https://tuneup.fiveruns.com/runs/699)

If you have any suggestions i would love for my main page to not take  
5000 milliseconds to load : )

---

<div class="post-metadata">

**Author:** ![indigoi](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/i/b3f665/32.png) [@indigoi](https://www.ruby-forum.com/u/indigoi)\
**Post date:** [October 28, 2008, 10:40am UTC](https://www.ruby-forum.com/t/backwards-n-1-problem/151929/2 "2008-10-28T10:40:08Z")

</div>

On 28 Oct 2008, at 00:33, Richard S. wrote:

> I already have all the info i need stored in @definitions, so this  
> should only require one SQL call, but unfortunately this line:
> 
> @Phrases \<\< definition.phrase(:include =\> [:definitions =\> :children])

An easy way - Phrase.find :all, :include =\> […], :conditions =\>  
[“definitions.phrase\_id in (?)”, @definitions]

or something like  
@definitions = Definition.find :all, :include =\> [:phrase =\>  
{:definitions =\> :children}], :order =\> ‘rank desc’, :limit =\> 10  
@phrases = @definitions.collect {|definition| definition.phrase}

might do the trick.

Fred

---

<div class="post-metadata">

**Author:** ![indigoi](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/i/b3f665/32.png) [@indigoi](https://www.ruby-forum.com/u/indigoi)\
**Post date:** [October 29, 2008, 4:17am UTC](https://www.ruby-forum.com/t/backwards-n-1-problem/151929/3 "2008-10-29T04:17:29Z")

</div>

That knocked off about 1000ms, thanks for the help! Is it possible to  
re-arrange the order of your database all together??

When I take out the :order =\> ‘rank desc’ my sql call time gets cut in  
half, is there any way to tell RoR to automatically sort my definitions  
(in the DB) by rank descending??

I already have this code in my phrase.rb

“has\_many :definitions, :order =\> ‘rank DESC’”

but is it possible to have an entire model be automatically ordered by a  
specific column inside of the database?? In this case by rank.

---

<div class="post-metadata">

**Author:** ![indigoi](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/i/b3f665/32.png) [@indigoi](https://www.ruby-forum.com/u/indigoi)\
**Post date:** [October 29, 2008, 10:11am UTC](https://www.ruby-forum.com/t/backwards-n-1-problem/151929/4 "2008-10-29T10:11:47Z")

</div>

On 29 Oct 2008, at 03:17, Richard S.  
\<removed\_email\_address@domain.invalid

> wrote:

> “has\_many :definitions, :order =\> ‘rank DESC’”
> 
> but is it possible to have an entire model be automatically ordered  
> by a  
> specific column inside of the database?? In this case by rank.

Nope. Or rather at the end of the day the database still needs to sort  
it. An index on the column you are ordering by usually helps.

Fred.
