acquisto viagra originale sildenafil prezzo levitra viagra cialis differenze vendita cialis senza ricetta durata levitra cialis femminile viagra naturale farmacia cialis prezzo in farmacia cialis miglior prezzo viagra costa viagra generico in farmacia kamagra controindicazioni cialis pasti acquistare viagra cialis generico opinioni viagra cialis differenza cialis vendo viagra generico contrassegno cialis rosa cialis da 2 5 mg cialis generico 5mg cialis caratteristiche compra viagra generico viagra roma viagra generico funziona comprare viagra in internet viagra x le donne prezzo levitra 10 mg ordina cialis viagra female acquista cialis generico confezioni cialis cialis generico costo cialis pagamento alla consegna cialis farmacia senza ricetta viagra generico in italia erboristeria viagra naturale farmacie viagra comprare cialis su internet vendita cialis generico levitra acquisto costi cialis levitra confezioni e prezzi levitra 10 mg costo cialis pagamento contrassegno levitra prezzo vendita viagra in italia viagra naturale per donne prezzo farmacia cialis farmaco levitra cialis prescrizione medica cialis da banco levitra in farmacia medicinale levitra cialis torrino prezzo cialis 10 cialis prezzo in farmacia acquisto cialis senza ricetta cialis generico sicuro levitra vendita sildenafil dosaggio vendita cialis san marino viagra vendita libera viagra per femmine viagra generico opinioni viagra da banco cialis da banco viagra serve la ricetta comprare cialis online viagra online sicuro viagra euro prezzi viagra cialis o simili acquisto cialis in farmacia levitra 10 mg generico cialis su internet acquistare cialis generico cialis medicinale comprare cialis in contrassegno prezzo cialis generico impotenza rimedi cialis effetti collaterali viagra generico online cialis o simili cialis acquisto on line compra cialis in italia cialis benefici cialis farmaco levitra 20 mg levitra costo cialis caratteristiche acquisto cialis on line cialis 5 mg prezzo cialis san marino tadalafil principio attivo cialis comprare comprare viagra viagra costo costo cialis generico cialis costa acquisto viagra net levitra ci vuole ricetta comprare cialis a san marino levitra contrassegno viagra sostituto kamagra opinioni levitra contrassegno viagra alternativo acquisto cialis svizzera viagra per donne viagra a san marino cialis originale cialis generico opinioni cialis in contrassegno cialis vendita libera viagra prezzi in farmacia cialis pagamento paypal comprare cialis sicuro viagra quanto costa in farmacia differenze cialis viagra cialis prezzo acquisto viagra net cialis prezzo farmacia levitra costo in farmacia acquistare cialis su internet acquistare viagra in italia cialis fa bene viagra x le donne sildenafil 100 mg viagra naturale funziona cialis generico costo viagra generico in farmacia acquista levitra vendita cialis italia viagra compresse cialis costo viagra farmacie kamagra funziona offerte viagra viagra per donne viagra donna cialis al naturale dosaggio viagra prezzo viagra farmacia sildenafil generico levitra acquista levitra originale viagra sottobanco vendo cialis milano viagra fa bene viagra 100 prezzo cialis 20 mg prezzo in farmacia prescrizione cialis acquistare cialis in farmacia aquisto viagra comprare viagra svizzera cialis farmaco benefici viagra viagra cialis differenze viagra alle donne levitra farmaco prezzo tadalafil farmaci impotenza viagra e cialis differenze viagra svizzera cialis alle erbe tadalafil 10 mg cialis fa bene viagra medicinale viagra compresse cialis vendita in farmacia viagra pasti levitra 5 mg prezzo viagra senza ricetta in svizzera cialis generico 10 mg viagra costo effetti viagra sulle donne levitra costo viagra x donne levitra ricetta medica acquisto cialis acquisto levitra online cialis 10 mg cialis super active levitra informazioni sildenafil prezzo viagra meccanismo d'azione cialis controindicazioni cialis vendita in italia viagra vendita in italia viagra dogana viagra femminile naturale vendita viagra san marino costo cialis in francia levitra generico in farmacia levitra generico online acquistare cialis acquistare levitra prescrizione viagra compro levitra femminile viagra viagra informazioni vendita viagra san marino viagra torino libera vendita cialis costo levitra 10 mg vendita cialis cialis alle erbe viagra acquisto sicuro viagra prezzo farmacia viagra alle erbe viagra naturale femminile costo levitra cialis euro tadalafil farmacia viagra nelle donne vendo cialis milano curare impotenza viagra a basso costo viagra naturale in erboristeria tadalafil effetti collaterali cialis recensioni cialis italia cialis 20 mg originale viagra rosa per donne comprare viagra internet farmaci impotenza compresse levitra viagra da 25 vendo viagra milano viagra acquisto sicuro cialis originale vendita comprare viagra in farmacia comprare cialis in svizzera viagra da 25 mg viagra modalità d'uso viagra ricetta ripetibile cialis per donne prezzo viagra 50 mg female viagra femigra viagra a san marino curare impotenza viagra ricetta libera vendita cialis prezzo levitra viagra offerte vendita cialis in contrassegno cialis compresse 5 mg cialis forum al femminile generico levitra comprare levitra viagra euro acquisto levitra tadalafil generico farmacia viagra erbe viagra farmaco generico cialis torino viagra acquistare cialis generico forum cialis compresse cialis generico india cialis dosaggio tadalafil effetti collaterali dosaggio levitra levitra 5 mg prezzo sildenafil donne viagra compra viagra e simili cialis europa svizzera viagra cialis recensioni levitra medicinale prezzi cialis cialis cialis differenze farmaco cialis ordina viagra comprare cialis sicuro cialis durata effetto levitra generico cialis 5 mg quanto costa comprare viagra in svizzera viagra prezzo farmacia compra viagra online viagra dove comprarlo acquista cialis on line cialis 20 mg effetti collaterali cialis generico sicuro cialis rosa viagra da 25 acquisto viagra levitra opinioni ricetta cialis cialis senza prescrizione acquistare cialis online cialis 20 mg in farmacia acquisto viagra svizzera cialis 5 mg quanto costa cura impotenza vendita cialis generico in italia vendo cialis napoli comprare cialis originale vardenafil costo viagra cialis levitra differenze cialis roma compro viagra online viagra 100 mg prezzo viagra in farmacia viagra originale cialis medicinale cialis comprare online viagra in contrassegno tadalafil in farmacia comprare viagra senza ricetta kamagra generico viagra quanto costa in farmacia levitra da 20 svizzera viagra cialis naturale funziona viagra senza ricetta forum cialis professional vendita cialis originale acquistare viagra farmacia levitra vendita viagra contrassegno comprare cialis senza ricetta costo cialis 20 mg cialis 20 mg originale cialis 5 mg generico cialis generico funziona viagra generico vendita impotenza sessuale cialis vendita on line vendita cialis generico in italia levitra originale prezzo disfunzione erettile rimedi costo cialis 5 mg cialis italia vendita cialis senza ricetta vendita viagra senza ricetta levitra donna compro viagra generico pasticche cialis viagra senza prescrizione prezzo viagra in farmacia viagra generico prezzo cialis farmacia prezzo compra viagra originale viagra super acquisto viagra in farmacia differenze cialis viagra levitra costo cialis

RESTful searching in Rails

26 Jun 2008

Over and over again I see people asking about how to do a search the “RESTful way” with Rails, and every time I do I just shake my head and wonder why we sometimes get so caught up in how we do something that it keeps from actually doing it. So, with that introduction, I want to present to you a really simple implementation of the most basic type of searching you can do in a Rails application. It just so happens that this method will also handle the bulk of your searching needs.

Let’s say you want to search through orders for a shopping cart. Instead of doing something fancy, let’s just assume you want to search on the customer’s name, the customer’s email, and also optionally restrict the search to a date range. First, here’s a snippet from the view, index.html.erb:


...
< % form_tag({:action => 'index'}, :method => 'get') do %>
< label>Name/Email< /label>
< %= text_field_tag :q, h(params[:q]) %>
< label>Date Range< /label>
< %= text_field_tag :start_on, h(params[:start_on]) %>
< %= text_field_tag :end_on, h(params[:end_on]) %>

< %= submit_tag 'Search' %>
< % end %>
...

What, throwing search right into the index action? You betcha. Oh, you want pagination with that? No problem:


...
< %= will_paginate @orders, :params => params %>
...

Bam. Ok, on to the controller:


class OrdersController < ApplicationController

def index
@orders = Order.paginate(:all,
:order => 'orders.created_at',
:page => params[:page],
:conditions => search_conditions,
:joins => :user)
end

...

protected

def search_conditions
cond_params = {
:q => "%#{params[:q]}%",
:start_on => Chronic.parse(params[:start_on]),
:end_on => Chronic.parse(params[:end_on])
}

cond_strings = returning([]) do |strings|
strings < < "(users.name like :q or users.email like :q)" unless params[:q].blank?
if cond_params[:start_on] && cond_params[:end_on]
strings << "orders.created_at between :start_on and :end_on"
elsif cond_params[:start_on]
strings << "orders.created_at >= :start_on"
elsif cond_params[:end_on]
strings < < "orders.created_at <= :end_on"
end
end

cond_strings.any? ? [ cond_strings.join(' and '), cond_params ] : nil
end
end

It just doesn't get much easier than this. If there was no search, then the :conditions arg gets passed in as nil, which gets silently dropped. If there was one, then we build some conditions based on which parameters were specified. With a little bit of help from the chronic gem, we get easy date entry, to boot.

We're done. And I just don't care whether it's RESTful or not. ;)


Actions

Informations

14 responses to “RESTful searching in Rails”

Scott Raymond (14:32:32) :

And fortunately, it’s perfectly RESTful to boot! I’ve never understood why that’s not obvious, but oh well.

Ben (16:28:39) :

Of course it’s RESTful – search results for a single resource type are really just filtered listing views, which is what you’re doing here. It gets a bit more complicated to stay RESTful when you’re searching across multiple resource types (say, posts and people), but even that’s not much of a challenge.

topfunky (17:59:06) :

I’ve been using this technique in my apps and it just makes sense. I’m not sure what the debate is about!

And in my experience, you don’t even need to pass params to will_paginate. It picks them up automatically.

Ben (19:19:43) :

@topfunky – Ah, cool, I didn’t even try it without. :)

A Fresh Cup » Blog Archive » Double Shot #237 (03:05:01) :

[...] RESTful searching in Rails – Ben Curtis argues for simplicity rather than an extra resource. I’ve done it both ways, and tend to agree. [...]

Ben Hughes (06:10:05) :

I would encourage everyone to check out Ryan Bates’ post on “Anonymous Scopes”:
http://railscasts.com/episodes/112

He presents a fairly elegant way of conditionally including different search conditions, IMO must better than manually constructing SQL strings then joining them with AND…

Tekhne (07:23:42) :

I’m sorry to pick nits (ignore me if you don’t care), but you wrote “if there was no search.” I think that’s grammatically incorrect. I think it should be “if there were no search.” See http://en.wikipedia.org/wiki/Subjunctive.

Ryan Bates (07:42:29) :

Thanks for posting this, I’ve often wondered why some struggle with RESTful searching as well. Using the index action just makes sense.

I’d recommend moving the search logic out of the controller and into the model, but beyond that looks great. :)

On a related note I have a couple screencasts on searching which some may find helpful.
http://railscasts.com/episodes/37
http://railscasts.com/episodes/111

Alex Vollmer (08:11:30) :

There seems to be a very common mis-conception that the presence of query parameters is somehow un-REST-ful. As the other commenters have pointed out, this isn’t really the case, and as Ben pointed out we still have _resources_ at the core of the design which is quite REST-ful.

As the resident “REST-guy” at my company, I found I often have to debunk these strange myths people form in their heads. If we’re going explain REST to those who don’t get it, we better make damn sure we explain it right.

Great post, Ben.

Jonathan Tron (14:06:41) :

I second Ryan Bates about moving search logic in the model, anyway I found pretty useful to use an OpenStruct initialized with the search params :

@search = OpenStruct.new(params[:search])

Then in your view you can use the different FormHelper methods on the @search object.
If at any time you need/want to store queries (to speedup app, for later reuse or for statistics) you can easily swap your OpenStruct with your model.

Adam Meehan (22:31:41) :

I think Alex is right, that it was the query params that threw people. I continued doing it the same way as you have done it, but read enough posts about ‘the RESTful search problem’ I started doubt myself.

There are few solutions out there, but I found the criteria_query plugin (http://www.muermann.org/ruby/criteria_query/) good for building model find conditions from form params like your example.

RESTful Searching in Rails (06:20:59) :

[...] Ben Curtis demonstrates RESTful Searching in Rails. [...]

Dan Manges (13:06:42) :

+1 on moving the search logic to the model. For what it’s worth, you don’t need to wrap the params in an h call when passing to the form helpers.

Latest Bookmarks on Ma.gnolia.com at Ivan Enviroman (23:02:50) :

[...] BenCurtis.com » RESTful searching in Rails [...]

Leave a comment