# How to specify condition for eagerly joined model using :inc

**URL:** <https://www.ruby-forum.com/t/how-to-specify-condition-for-eagerly-joined-model-using-inc/69814>\
**Category:** Rails\
**Created:** [September 24, 2006, 11:55am UTC](https://www.ruby-forum.com/t/how-to-specify-condition-for-eagerly-joined-model-using-inc/69814 "2006-09-24T11:55:00Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![Hammed\_M](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/h/7feea3/32.png) [@Hammed\_M](https://www.ruby-forum.com/u/Hammed_M)\
**Post date:** [September 24, 2006, 11:55am UTC](https://www.ruby-forum.com/t/how-to-specify-condition-for-eagerly-joined-model-using-inc/69814/1 "2006-09-24T11:55:00Z")

</div>

I’d like to specify conditions for a model that I’m left outer joining  
using :include. A simplification of the problem:

User.find :all, :include =\> :addresses, :conditions =\>  
[“addresses.is\_active = 1”]

Results in the following SQL.

SELECT  
users._,  
addresses._  
FROM users  
LEFT OUTER JOIN addresses ON addresses.user\_id = users.id  
WHERE (addresses.is\_active = 1)

The SQL I’d like is:

SELECT  
users._,  
addresses._  
FROM users  
LEFT OUTER JOIN addresses ON addresses.user\_id = users.id AND  
addresses.is\_active = 1

Note the condition has been moved from the main query’s WHERE clause  
to the left join’s condition. Any way to do this? I really don’t want  
to use find\_by\_sql.

Thanks

Hammed

---

<div class="post-metadata">

**Author:** ![Hammed\_M](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/h/7feea3/32.png) [@Hammed\_M](https://www.ruby-forum.com/u/Hammed_M)\
**Post date:** [September 24, 2006, 3:53pm UTC](https://www.ruby-forum.com/t/how-to-specify-condition-for-eagerly-joined-model-using-inc/69814/2 "2006-09-24T15:53:52Z")

</div>

Thanks Mark.

That works for the example I quoted but I do need to specify the  
conditions (which vary) when creating the query in the controller.

Hammed

---

<div class="post-metadata">

**Author:** ![Hammed\_M](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/h/7feea3/32.png) [@Hammed\_M](https://www.ruby-forum.com/u/Hammed_M)\
**Post date:** [September 24, 2006, 3:39pm UTC](https://www.ruby-forum.com/t/how-to-specify-condition-for-eagerly-joined-model-using-inc/69814/3 "2006-09-24T15:39:51Z")

</div>

Hammed M. wrote:

> ```
> addresses.*
> addresses.*
> 
> ```
> 
> FROM users  
> LEFT OUTER JOIN addresses ON addresses.user\_id = users.id AND  
> addresses.is\_active = 1
> 
> Note the condition has been moved from the main query’s WHERE clause  
> to the left join’s condition. Any way to do this? I really don’t want  
> to use find\_by\_sql.

Try:

class User  
has\_many :active\_addresses, :className =\> Address,  
:conditions =\> ‘addresses.is\_active = 1’  
end

User.find :all, :include =\> :active\_addresses

–  
We develop, watch us RoR, in numbers too big to ignore.

---

<div class="post-metadata">

**Author:** ![Hammed\_M](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/h/7feea3/32.png) [@Hammed\_M](https://www.ruby-forum.com/u/Hammed_M)\
**Post date:** [September 24, 2006, 4:43pm UTC](https://www.ruby-forum.com/t/how-to-specify-condition-for-eagerly-joined-model-using-inc/69814/4 "2006-09-24T16:43:55Z")

</div>

Mark Reginald J. wrote:

> Hmm, the only way I can think of is:
> 
> class User  
> has\_many :conditional\_addresses, :className =\> Address  
> end
> 
> User.reflect\_on\_association(:conditional\_addresses).options[:conditions] = ‘…’  
> User.find :all, :include =\> :conditional\_addresses

Somewhat neater:

class User  
has\_many :conditional\_addresses, :className =\> Address do  
def conditions=(condition)  
reflection.options[:conditions] = condition  
end  
end  
end

User.conditional\_addresses.conditions = ‘…’  
User.find :all, :include =\> :conditional\_addresses

–  
We develop, watch us RoR, in numbers too big to ignore.

---

<div class="post-metadata">

**Author:** ![Hammed\_M](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/h/7feea3/32.png) [@Hammed\_M](https://www.ruby-forum.com/u/Hammed_M)\
**Post date:** [September 24, 2006, 4:29pm UTC](https://www.ruby-forum.com/t/how-to-specify-condition-for-eagerly-joined-model-using-inc/69814/5 "2006-09-24T16:29:54Z")

</div>

Hammed M. wrote:

> That works for the example I quoted but I do need to specify the  
> conditions (which vary) when creating the query in the controller.

Hmm, the only way I can think of is:

class User  
has\_many :conditional\_addresses, :className =\> Address  
end

User.reflect\_on\_association(:conditional\_addresses).options[:conditions]  
= ‘…’  
User.find :all, :include =\> :conditional\_addresses

–  
We develop, watch us RoR, in numbers too big to ignore.

---

<div class="post-metadata">

**Author:** ![Hammed\_M](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/h/7feea3/32.png) [@Hammed\_M](https://www.ruby-forum.com/u/Hammed_M)\
**Post date:** [September 26, 2006, 3:52am UTC](https://www.ruby-forum.com/t/how-to-specify-condition-for-eagerly-joined-model-using-inc/69814/6 "2006-09-26T03:52:21Z")

</div>

Thanks Mark. Not exactly what I was hoping for but this actually  
answers another question I had.

Cheers

Hammed

---

<div class="post-metadata">

**Author:** ![Hammed\_M](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/h/7feea3/32.png) [@Hammed\_M](https://www.ruby-forum.com/u/Hammed_M)\
**Post date:** [September 30, 2006, 12:54pm UTC](https://www.ruby-forum.com/t/how-to-specify-condition-for-eagerly-joined-model-using-inc/69814/7 "2006-09-30T12:54:07Z")

</div>

Mark Reginald J. wrote:

> class User  
> has\_many :conditional\_addresses, :className =\> Address do  
> def conditions=(condition)  
> reflection.options[:conditions] = condition  
> end  
> end  
> end
> 
> User.conditional\_addresses.conditions = ‘…’  
> User.find :all, :include =\> :conditional\_addresses

Just for the record, this won’t work because conditional\_addresses  
is a User instance method, not a class method, so with this code  
you’d have to write: User.new.conditional\_addresses.conditions = ‘…’

Better would be:

class User \< ActiveRecord::Base  
has\_many :addresses

def self.with\_conditions(assoc, conditions)  
options = reflect\_on\_association(assoc).options  
orig\_conditions = options[:conditions]  
options[:conditions] = conditions  
yield  
options[:conditions] = orig\_conditions  
end  
end

User.with\_conditions(:addresses, ‘addresses.is\_active = 1’) do  
User.find :all, :include =\> :addresses  
end

You could even augment method\_missing and add a class context  
so you can instead write:

User.with\_address\_conditions(‘addresses.is\_active = 1’) do  
find :all, :include =\> :addresses  
end

–  
We develop, watch us RoR, in numbers too big to ignore.

---

<div class="post-metadata">

**Author:** ![Hammed\_M](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/h/7feea3/32.png) [@Hammed\_M](https://www.ruby-forum.com/u/Hammed_M)\
**Post date:** [June 20, 2007, 12:04am UTC](https://www.ruby-forum.com/t/how-to-specify-condition-for-eagerly-joined-model-using-inc/69814/8 "2007-06-20T00:04:08Z")

</div>

Hi Mark,

Thank you _so_ much for your code and your return trip to update/fix it  
above as well. We have a large schema with tons of lookup tables  
defining entity type/kind and the problem as original descibed has come  
up a bunch.

Your code above DOES work as described. I just set this up and was able  
to do:

```
Person.with_conditions(:addresses, 

```

‘addresses\_mailing.id\_t\_addresses\_mailing = 2’) do  
@people = Person.find :all, :include =\> [{:addresses =\>  
:t\_address}, :email\_addresses], :conditions =\> “name\_last like ‘W%’”,  
:limit =\> 15  
end

which, includes multiple other associations, a limit clause and some  
WHERE clause action as well.

All best!

> > class User  
> > has\_many :conditional\_addresses, :className =\> Address do  
> > def conditions=(condition)  
> > reflection.options[:conditions] = condition  
> > end  
> > end  
> > end
> > 
> > User.conditional\_addresses.conditions = ‘…’  
> > User.find :all, :include =\> :conditional\_addresses
> 
> Just for the record, this won’t work because conditional\_addresses  
> is a User instance method, not a class method, so with this code  
> you’d have to write: User.new.conditional\_addresses.conditions = ‘…’
> 
> Better would be:
> 
> class User \< ActiveRecord::Base  
> has\_many :addresses
> 
> def self.with\_conditions(assoc, conditions)  
> options = reflect\_on\_association(assoc).options  
> orig\_conditions = options[:conditions]  
> options[:conditions] = conditions  
> yield  
> options[:conditions] = orig\_conditions  
> end  
> end
> 
> User.with\_conditions(:addresses, ‘addresses.is\_active = 1’) do  
> User.find :all, :include =\> :addresses  
> end
> 
> You could even augment method\_missing and add a class context  
> so you can instead write:
> 
> User.with\_address\_conditions(‘addresses.is\_active = 1’) do  
> find :all, :include =\> :addresses  
> end
> 
> –  
> We develop, watch us RoR, in numbers too big to ignore.
