# Building multiple find conditions

**URL:** <https://www.ruby-forum.com/t/building-multiple-find-conditions/70601>\
**Category:** Rails\
**Created:** [February 19, 2006, 9:04pm UTC](https://www.ruby-forum.com/t/building-multiple-find-conditions/70601 "2006-02-19T21:04:47Z")\
**Posts on this page:** 9\
**Page:** 1

<div class="post-metadata">

**Author:** ![craigrails](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/c2a13f/32.png) [@craigrails](https://www.ruby-forum.com/u/craigrails)\
**Post date:** [February 19, 2006, 9:04pm UTC](https://www.ruby-forum.com/t/building-multiple-find-conditions/70601/1 "2006-02-19T21:04:47Z")

</div>

I am trying to allow for AND type ‘find’ but to allow for simply a  
single set of find criteria.

controller code…

@vw\_string = @vw\_string1 = @vw\_string2 = @vw\_string3 = []

```
  if params[:beg_intake_date] != "" then
    @vw_string1 = ["intake_date between ? and ?",
    params[:beg_intake_date], params[:end_intake_date] ]
  end

  if params[:beg_referral_date] != "" then
    @vw_string2 = ["referral_date between ? and ?",
    params[:beg_referral_date], params[:end_referral_date] ]
  end

  if params[:beg_discharge_date] != "" then
    @vw_string3 = ["discharge_date between ? and ?",
    params[:beg_discharge_date], params[:end_discharge_date] ]
  end

```

-\> @vw\_string = [@vw\_string1, @vw\_string2, @vw\_string3]

```
  @placement_pages, @placements = paginate(
    :placements,
    :conditions => @vw_string,
    :include => [:client, :case_manager, :facility],
    :order_by => 'referral_date',
    :per_page => 14)

```

The above setup gives me an error 'undefined method '%" for []:Array

Same thing if I set…

@vw\_string = @vw\_string1, @vw\_string2, @vw\_string3

and if I do it like this…

@vw\_string = [@vw\_string1] [@vw\_string2] [@vw\_string3]

I get can’t convert Array into Integer

How can I get the @vw\_string into something that allows for ‘AND’  
conditions or singular conditions if only 1 criteria resulted from a  
search?

Craig

---

<div class="post-metadata">

**Author:** ![craigrails](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/c2a13f/32.png) [@craigrails](https://www.ruby-forum.com/u/craigrails)\
**Post date:** [February 19, 2006, 11:08pm UTC](https://www.ruby-forum.com/t/building-multiple-find-conditions/70601/2 "2006-02-19T23:08:43Z")

</div>

Craig-

```
You can do this quite easily with my ez_where plugin, get it from

```

svn here:

[http://opensvn.csie.org/ezra/rails/plugins/dev/ez\_where/](http://opensvn.csie.org/ezra/rails/plugins/dev/ez_where/)

```
And here is an example of doing what you want to do with it, I am

```

assuming that your model is called Placement. Note that in my plugin  
the shorthand for a BETWEEN ? AND ? query is \<=\> the spaceship  
operator 😉 Also note that I am using the range operator … to make  
the date ranges.

cond = Caboose::EZ::Condition.new do  
intake\_date \<=\> (params[:beg\_intake\_date]…params  
[:end\_intake\_date]) unless params[:beg\_intake\_date].nil?  
referral\_date \<=\> [params[:beg\_referral\_date]…params  
[:end\_referral\_date] ] unless params[:beg\_referral\_date].nil?  
discharge\_date \<=\> [params[:beg\_discharge\_date]…params  
[:end\_discharge\_date] ] unless params[:beg\_discharge\_date].nil?  
end

Then you can use cond.to\_sql in your copnditions like:

:conditions =\> cond.to\_sql

So if all three dates are available in the params hash your  
cond.to\_sql will look like this:

> > p cond.to\_sql  
> > =\> [“intake\_date BETWEEN ? AND ? AND referral\_date BETWEEN ? AND ?  
> > AND discharge\_date BETWEEN ? AND ?”, Sun Feb 19 14:02:44 PST 2006,  
> > Mon Feb 20 14:02:44 PST 2006, Sun Feb 19 14:02:44 PST 2006, Mon Feb  
> > 20 14:02:44 PST 2006, Sun Feb 19 14:02:44 PST 2006, Mon Feb 20  
> > 14:02:44 PST 2006]

If only some or one of the dates is present in params then it will do  
the right thing and either just put the one date range in there or  
use4 AND to join together as many date ranges as are present in the  
params.

Here is a link to my blog where I write up all the other ways to use  
my plugin:

[http://brainspl.at/articles/2006/01/30/i-have-been-busy](http://brainspl.at/articles/2006/01/30/i-have-been-busy)

Cheers-  
-Ezra

On Feb 19, 2006, at 12:02 PM, Craig W. wrote:

> ```
> end
> 
> ```
> 
> How can I get the @vw\_string into something that allows for ‘AND’  
> conditions or singular conditions if only 1 criteria resulted from a  
> search?
> 
> Craig
> 
> * * *
> 
> Rails mailing list  
> removed\_email\_address@domain.invalid  
> [http://lists.rubyonrails.org/mailman/listinfo/rails](http://lists.rubyonrails.org/mailman/listinfo/rails)

-Ezra Z.  
WebMaster  
Yakima Herald-Republic Newspaper  
removed\_email\_address@domain.invalid  
509-577-7732

---

<div class="post-metadata">

**Author:** ![craigrails](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/c2a13f/32.png) [@craigrails](https://www.ruby-forum.com/u/craigrails)\
**Post date:** [February 19, 2006, 11:20pm UTC](https://www.ruby-forum.com/t/building-multiple-find-conditions/70601/3 "2006-02-19T23:20:51Z")

</div>

I think I just got a woodie…thanks - I am going to dive into this  
later because I’ve got a client to please at the moment but it appears  
to be a blessing of many magnitudes.

Thanks

Craig

---

<div class="post-metadata">

**Author:** ![craigrails](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/c2a13f/32.png) [@craigrails](https://www.ruby-forum.com/u/craigrails)\
**Post date:** [February 19, 2006, 11:27pm UTC](https://www.ruby-forum.com/t/building-multiple-find-conditions/70601/4 "2006-02-19T23:27:06Z")

</div>

Craig -

```
There was slight typo in my last email. The setup should be thus:

```

cond = Caboose::EZ::Condition.new do  
intake\_date \<=\> (params[:beg\_intake\_date]…params  
[:end\_intake\_date]) unless params[:beg\_intake\_date].nil?  
referral\_date \<=\> ( params[:beg\_referral\_date]…params  
[:end\_referral\_date] ) unless params[:beg\_referral\_date].nil?  
discharge\_date \<=\> ( params[:beg\_discharge\_date]…params  
[:end\_discharge\_date] ) unless params[:beg\_discharge\_date].nil?  
end

Cheers-  
-Ezra

On Feb 19, 2006, at 2:19 PM, Craig W. wrote:

> > 14:02:44 PST 2006]
> > 
> > > ```
> > > end
> > > :conditions => @vw_string,
> > > 
> > > ```
> > > 
> > > and if I do it like this…
> > 
> > 509-577-7732
> > 
> > * * *
> > 
> > Rails mailing list  
> > removed\_email\_address@domain.invalid  
> > [http://lists.rubyonrails.org/mailman/listinfo/rails](http://lists.rubyonrails.org/mailman/listinfo/rails)
> 
> * * *
> 
> Rails mailing list  
> removed\_email\_address@domain.invalid  
> [http://lists.rubyonrails.org/mailman/listinfo/rails](http://lists.rubyonrails.org/mailman/listinfo/rails)

-Ezra Z.  
WebMaster  
Yakima Herald-Republic Newspaper  
removed\_email\_address@domain.invalid  
509-577-7732

---

<div class="post-metadata">

**Author:** ![craigrails](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/c2a13f/32.png) [@craigrails](https://www.ruby-forum.com/u/craigrails)\
**Post date:** [April 14, 2006, 8:25am UTC](https://www.ruby-forum.com/t/building-multiple-find-conditions/70601/5 "2006-04-14T08:25:23Z")

</div>

That looks fine… but wouldn’t it be easier to just try it out first?  
😉

---

<div class="post-metadata">

**Author:** ![craigrails](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/c2a13f/32.png) [@craigrails](https://www.ruby-forum.com/u/craigrails)\
**Post date:** [April 14, 2006, 4:44pm UTC](https://www.ruby-forum.com/t/building-multiple-find-conditions/70601/6 "2006-04-14T16:44:03Z")

</div>

On Apr 13, 2006, at 10:21 PM, Arch S. wrote:

> –  
> Posted via [http://www.ruby-forum.com/](http://www.ruby-forum.com/).
> 
> * * *
> 
> Rails mailing list  
> removed\_email\_address@domain.invalid  
> [http://lists.rubyonrails.org/mailman/listinfo/rails](http://lists.rubyonrails.org/mailman/listinfo/rails)

@posts = Post.find\_with\_block(:all) do  
published == 1  
author == author  
end

That should do it for you.

Cheers-  
-Ezra

---

<div class="post-metadata">

**Author:** ![craigrails](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/c2a13f/32.png) [@craigrails](https://www.ruby-forum.com/u/craigrails)\
**Post date:** [April 14, 2006, 7:21am UTC](https://www.ruby-forum.com/t/building-multiple-find-conditions/70601/7 "2006-04-14T07:21:44Z")

</div>

I want to search for two conditions in one find. Is there no way to do  
this without the plugin?

example:

@posts = Post.find(:all, :conditions =\> [ “published = 1 AND author =  
?”, author])

Is that legal/supported?

---

<div class="post-metadata">

**Author:** ![craigrails](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/c2a13f/32.png) [@craigrails](https://www.ruby-forum.com/u/craigrails)\
**Post date:** [April 14, 2006, 6:49pm UTC](https://www.ruby-forum.com/t/building-multiple-find-conditions/70601/8 "2006-04-14T18:49:42Z")

</div>

On Apr 14, 2006, at 8:59 AM, Guest wrote:

> > > [http://lists.rubyonrails.org/mailman/listinfo/rails](http://lists.rubyonrails.org/mailman/listinfo/rails)  
> > > Cheers-  
> > > -Ezra
> 
> I don’t see that method in the api. Is the documentation  
> ([http://api.rubyonrails.com/](http://api.rubyonrails.com/)) out of date?

Guest-

```
No thats not part of core rails. It's my plugin called ez_where. It

```

adds a ton of functionality to create dynamic :conditions on your AR  
find’s. You can read more about it here:

```
http://brainspl.at/articles/2006/01/30/i-have-been-busy

```

Cheers-  
-Ezra

---

<div class="post-metadata">

**Author:** ![craigrails](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/c2a13f/32.png) [@craigrails](https://www.ruby-forum.com/u/craigrails)\
**Post date:** [April 14, 2006, 5:59pm UTC](https://www.ruby-forum.com/t/building-multiple-find-conditions/70601/9 "2006-04-14T17:59:25Z")

</div>

Ezra Z. wrote:

> On Apr 13, 2006, at 10:21 PM, Arch S. wrote:
> 
> > –  
> > Posted via [http://www.ruby-forum.com/](http://www.ruby-forum.com/).
> > 
> > * * *
> > 
> > Rails mailing list  
> > removed\_email\_address@domain.invalid  
> > [http://lists.rubyonrails.org/mailman/listinfo/rails](http://lists.rubyonrails.org/mailman/listinfo/rails)
> 
> @posts = Post.find\_with\_block(:all) do  
> published == 1  
> author == author  
> end
> 
> That should do it for you.
> 
> Cheers-  
> -Ezra

I don’t see that method in the api. Is the documentation  
([http://api.rubyonrails.com/](http://api.rubyonrails.com/)) out of date?
