# Possible bug in eager loading

**URL:** <https://www.ruby-forum.com/t/possible-bug-in-eager-loading/122822>\
**Category:** Rails\
**Created:** [December 12, 2007, 4:23pm UTC](https://www.ruby-forum.com/t/possible-bug-in-eager-loading/122822 "2007-12-12T16:23:52Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![Mage](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/6f9a4e/32.png) [@Mage](https://www.ruby-forum.com/u/Mage)\
**Post date:** [December 12, 2007, 4:23pm UTC](https://www.ruby-forum.com/t/possible-bug-in-eager-loading/122822/1 "2007-12-12T16:23:52Z")

</div>

Hello,

```
    @users = User.find(:all, :include => {:user_data =>

```

:user\_data\_field}, :order =\> “username = ‘removed\_email\_address@domain.invalid’ desc”,  
:limit =\> 50)

This produces:

User Load IDs For Limited Eager Loading (74.648762) SELECT \* FROM  
(SELECT DISTINCT ON (users.id) users.id, username AS alias\_0 FROM users  
LEFT OUTER JOIN user\_data ON user\_data.user\_id = users.id LEFT OUTER  
JOIN user\_data\_fields ON user\_data\_fields.id = user\_data.field\_id ) AS  
id\_list ORDER BY id\_list.alias\_0 DESC LIMIT 50

User Load Including Associations (0.026093) SELECT users.“id” AS  
t0\_r0, users.“username” AS t0\_r1, users.“password” AS t0\_r2, , user\_data.“id” AS t1\_r0, user\_data.“entered\_when” AS  
t1\_r1, FROM users LEFT OUTER JOIN user\_data ON  
user\_data.user\_id = users.id LEFT OUTER JOIN user\_data\_fields ON  
user\_data\_fields.id = user\_data.field\_id WHERE users.id IN () ORDER BY username = ‘removed\_email\_address@domain.invalid’ desc

Which is, I think, very bad.

As I see the eager loading uses “username” instead of “username =  
‘removed\_email\_address@domain.invalid’” at odering. This will produce different results  
as expected, even won’t include the user ‘removed\_email\_address@domain.invalid’ which  
was the primary goal of this ordering.

I think that the web-programmer shouldn’t check the log for query  
modifications like this. Is there something I miss?

I am using Rails 1.2.6, Gentoo, Amd64.

```
   Mage
```

---

<div class="post-metadata">

**Author:** ![Mage](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/6f9a4e/32.png) [@Mage](https://www.ruby-forum.com/u/Mage)\
**Post date:** [December 12, 2007, 6:14pm UTC](https://www.ruby-forum.com/t/possible-bug-in-eager-loading/122822/2 "2007-12-12T18:14:05Z")

</div>

Hi Mage,

I’m not sure which db engine you’re using, but you might try  
rewriting your order by clause to use a case. Something like

case when username=‘removed\_email\_address@domain.invalid’ then 1 else 0 end desc

I’m shooting from the hip on this and am not sure which databases  
support using case in the order by clause. I’m pretty sure something  
like this will work on SQL Server, but it may not anywhere else.

If that doesn’t work, you might need to resort to find\_by\_sql and  
construct the query yourself.

Peace,  
Phillip

---

<div class="post-metadata">

**Author:** ![Mage](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/6f9a4e/32.png) [@Mage](https://www.ruby-forum.com/u/Mage)\
**Post date:** [December 12, 2007, 7:02pm UTC](https://www.ruby-forum.com/t/possible-bug-in-eager-loading/122822/3 "2007-12-12T19:02:00Z")

</div>

Dear Phillip,

it even gets worst.

PGError: ERROR: syntax error at or near “AS”  
LINE 1: …ROM (SELECT DISTINCT ON (users.id) users.id, case AS  
alias\_0…  
^  
: SELECT \* FROM (SELECT DISTINCT ON (users.id) users.id, case AS alias\_0  
FROM users LEFT OUTER JOIN user\_data ON user\_data.user\_id = users.id  
LEFT OUTER JOIN user\_data\_fields ON user\_data\_fields.id =  
user\_data.field\_id WHERE (exists (select id from  
migration\_active\_job\_offers where user\_id = users.id)) ) AS id\_list  
ORDER BY id\_list.alias\_0 DESC LIMIT 50

Postgresql supports “ORDER BY case when username = ‘xxxxx’ then 1 else 0  
end” format.

I still think it’s a bug and it really can generate invalid query  
results.

```
   Mage
```
