# Rails find(:all, :conditions) generates bad SQL?

**URL:** <https://www.ruby-forum.com/t/rails-find-all-conditions-generates-bad-sql/156819>\
**Category:** Rails\
**Created:** [January 3, 2009, 2:07pm UTC](https://www.ruby-forum.com/t/rails-find-all-conditions-generates-bad-sql/156819 "2009-01-03T14:07:00Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![srj](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/e9c0ed/32.png) [@srj](https://www.ruby-forum.com/u/srj)\
**Post date:** [January 3, 2009, 2:07pm UTC](https://www.ruby-forum.com/t/rails-find-all-conditions-generates-bad-sql/156819/1 "2009-01-03T14:07:00Z")

</div>

Hello,

What is wrong with my finder method? I have the following (using  
Rails 2.2.2):

```
     active_rows = Model.find(:all, :conditions => ["status

```

in ?", ACTIVE\_STATUSES])

ACTIVE\_STATUSES is a constant array with 4 status codes in it. The  
above rails line of code results in the following SQL SELECT  
statement:

SELECT \* FROM `model` WHERE (status in ‘AR’,‘GA’,‘GP’,‘GS’)

This is incorrect SQL - it should be written as:

SELECT \* FROM `model` WHERE status in (‘AR’,‘GA’,‘GP’,‘GS’)

Notice that the right-paren is in the wrong place. How can I change  
my statement to generate the correct SQL? I always assume that my  
code is wrong, but could this be a bug is Rails code?

Thank you

---

<div class="post-metadata">

**Author:** ![srj](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/e9c0ed/32.png) [@srj](https://www.ruby-forum.com/u/srj)\
**Post date:** [January 3, 2009, 2:44pm UTC](https://www.ruby-forum.com/t/rails-find-all-conditions-generates-bad-sql/156819/2 "2009-01-03T14:44:28Z")

</div>

On Jan 3, 1:06 pm, srj [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> statement:

your code should read “status in (?)” - rails doesn’t add parens for  
you at all (apart from surrounding the entire chunk of the conditions  
in parens).  
You could also write :conditions =\> {:status =\> ACTIVE\_STATUSES}

Fred

---

<div class="post-metadata">

**Author:** ![srj](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/e9c0ed/32.png) [@srj](https://www.ruby-forum.com/u/srj)\
**Post date:** [January 3, 2009, 6:30pm UTC](https://www.ruby-forum.com/t/rails-find-all-conditions-generates-bad-sql/156819/3 "2009-01-03T18:30:49Z")

</div>

> You could also write :conditions =\> {:status =\> ACTIVE\_STATUSES}

You could also write Model.find\_all\_by\_status(ACTIVE\_STATUSES)

So the less you do for Rails, the more opportunities it has to do it  
right.

---

<div class="post-metadata">

**Author:** ![srj](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/e9c0ed/32.png) [@srj](https://www.ruby-forum.com/u/srj)\
**Post date:** [January 5, 2009, 2:51am UTC](https://www.ruby-forum.com/t/rails-find-all-conditions-generates-bad-sql/156819/4 "2009-01-05T02:51:59Z")

</div>

Thank you - find\_all\_by\_status is the right way to go here (I should  
have thought of that!)
