# Ricerche condizionate in base alle categorie

**URL:** <https://www.ruby-forum.com/t/ricerche-condizionate-in-base-alle-categorie/159850>\
**Category:** IT\
**Created:** [February 9, 2009, 11:49am UTC](https://www.ruby-forum.com/t/ricerche-condizionate-in-base-alle-categorie/159850 "2009-02-09T11:49:25Z")\
**Posts on this page:** 9\
**Page:** 1

<div class="post-metadata">

**Author:** ![softwarewin](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/5f9b8f/32.png) [@softwarewin](https://www.ruby-forum.com/u/softwarewin)\
**Post date:** [February 9, 2009, 11:49am UTC](https://www.ruby-forum.com/t/ricerche-condizionate-in-base-alle-categorie/159850/1 "2009-02-09T11:49:25Z")

</div>

Salve a tutti,  
la struttura del DB Ã¨ la seguente.  
ho 4 tabelle:  
books  
categories  
authors  
nationalities

books -\> belongs\_to: categories, authors, nationalities

quindi nella tabella books ci sono category\_id, author\_id e  
nationality\_id.

Nel sito Ã¨ ovviamente possibile fare tutte le possibili scelte e quindi:  
solo la categoria;  
la categoria e l’autore;  
categoria, autore e nazionalitÃ  
etc…

Per fare una ricerca all’interno della tabella books in base ai  
parametri selezionati ho scritto nel controller:

if @category==“tutti” and @nation==“tutte” and @author==“tutti”  
@books=Book.find(:all,:order=\>‘title’)  
end

if not (@category==“tutti” and @nation==“tutte” and @author==“tutti”)  
@books=Book.find(:all,:conditions=\>[“category\_id=? and nationality\_id=?  
and  
author\_id=?”,@selected\_cat,@selected\_nat,@selected\_aut],:order=\>‘title’)  
end

if @nation==“tutte” and not (@category==“tutti” and @author==“tutti”)  
@books=Book.find(:all,:conditions=\>[“category\_id=? and  
author\_id=?”,@selected\_cat,@selected\_aut],:order=\>‘title’)  
end

if @category==“tutti” and not (@nation==“tutte” and @author==“tutti”)  
@books=Book.find(:all,:conditions=\>[“nationality\_id=? and  
author\_id=?”,@selected\_nat,@selected\_aut],:order=\>‘title’)  
end

if @author==“tutti” and not (@category==“tutti” and @nation==“tutte”)  
@books=Book.find(:all,:conditions=\>[“category\_id=? and  
nationality\_id=?”,@selected\_cat,@selected\_nat],:order=\>‘title’)  
end

if @nation==“tutte” and @category==“tutti” and not @author==“tutti”  
@books=Book.find(:all,:conditions=\>[“author\_id=?”,@selected\_aut],:order=\>‘title’)  
end

if @nation==“tutte” and @author==“tutti” and not @category==“tutti”  
@books=Book.find(:all,:conditions=\>[“category\_id=?”,@selected\_cat],:order=\>‘title’)  
end

if @author==“tutti” and @category==“tutti” and not @nation==“tutte”  
@books=Book.find(:all,:conditions=\>[“nationality\_id=?”,@selected\_nat],:order=\>‘title’)  
end

Secondo voi come si puÃ² snellire il codice?

Grazie mille in anticipo!

Luigi

---

<div class="post-metadata">

**Author:** ![softwarewin](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/5f9b8f/32.png) [@softwarewin](https://www.ruby-forum.com/u/softwarewin)\
**Post date:** [February 9, 2009, 12:05pm UTC](https://www.ruby-forum.com/t/ricerche-condizionate-in-base-alle-categorie/159850/2 "2009-02-09T12:05:06Z")

</div>

2009/2/9 Luigi M. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

non testato, ma dovrebbe funzionare:

conds = { }

conds[:category\_id] = @selected\_cat if @category != “tutte”  
conds[:nation\_id] = @selected\_nat if @nation != “tutte”  
conds[:author\_id] = @selected\_aut if @autor != “tutti”

@books = Book.find(:all, :conditions =\> conds, :order =\> ‘title’)

---

<div class="post-metadata">

**Author:** ![softwarewin](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/5f9b8f/32.png) [@softwarewin](https://www.ruby-forum.com/u/softwarewin)\
**Post date:** [February 9, 2009, 12:15pm UTC](https://www.ruby-forum.com/t/ricerche-condizionate-in-base-alle-categorie/159850/3 "2009-02-09T12:15:00Z")

</div>

Grazie mille per risposta.  
Adesso non posso provare il codice perÃ² mi viene un dubbio:  
scritto cosÃ¬ sembra che “conds” possa essere uguale solo ad una delle  
tre se non solo all’ultima condizione se questa Ã¨ vera?  
oppure si autoimplementa?

Grazie ancora

---

<div class="post-metadata">

**Author:** ![softwarewin](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/5f9b8f/32.png) [@softwarewin](https://www.ruby-forum.com/u/softwarewin)\
**Post date:** [February 9, 2009, 12:24pm UTC](https://www.ruby-forum.com/t/ricerche-condizionate-in-base-alle-categorie/159850/4 "2009-02-09T12:24:35Z")

</div>

2009/2/9 Luigi M. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> Grazie mille per risposta.  
> Adesso non posso provare il codice però mi viene un dubbio:  
> scritto così sembra che “conds” possa essere uguale solo ad una delle  
> tre se non solo all’ultima condizione se questa è vera?  
> oppure si autoimplementa?

in ruby,

x if y

è equivalente a:  
if y  
x  
end

quindi il codice che ti ho passato è equivalente a:

conds = { }

if @category != “tutte”  
conds[:category\_id] = @selected\_cat  
end

if @nation != “tutte”  
conds[:nation\_id] = @selected\_nat  
end

if @autor != “tutti”  
conds[:author\_id] = @selected\_aut  
end

solo che in quel modo mi sembra più chiaro.

vengono generate tutte e otto (2 scelte, vero o falso, elevato 3  
domande)  
possibilità.  
pietro

---

<div class="post-metadata">

**Author:** ![softwarewin](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/5f9b8f/32.png) [@softwarewin](https://www.ruby-forum.com/u/softwarewin)\
**Post date:** [February 9, 2009, 12:41pm UTC](https://www.ruby-forum.com/t/ricerche-condizionate-in-base-alle-categorie/159850/5 "2009-02-09T12:41:20Z")

</div>

2009/2/9 Andrea C. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> Personalmente trovo più leggibile:
> 
> conds = {}  
> conds.merge! {:category\_id =\> @selected\_cat} if @category != “tutte”  
> … e così via.

non mi piace.

> In alternativa, proprio ieri ho scoperto squirrel  
> ([http://www.thoughtbot.com/projects/squirrel/](http://www.thoughtbot.com/projects/squirrel/)), che ti permette di scrivere:
> 
> @books = Book.find(:all) do  
> category\_id == @selected\_cat if @category != “tutte”  
> …  
> order\_by title  
> end

questo sì che mi piace!

ma mi sembra di ricordare che in rails 2.3 ci sarà qualcosa di simile.

---

<div class="post-metadata">

**Author:** ![softwarewin](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/5f9b8f/32.png) [@softwarewin](https://www.ruby-forum.com/u/softwarewin)\
**Post date:** [February 9, 2009, 12:38pm UTC](https://www.ruby-forum.com/t/ricerche-condizionate-in-base-alle-categorie/159850/6 "2009-02-09T12:38:55Z")

</div>

On 2/9/09 12:04 PM, Pietro G. wrote:

> @books = Book.find(:all, :conditions =\> conds, :order =\> ‘title’)
> 
> * * *
> 
> Ml mailing list  
> removed\_email\_address@domain.invalid  
> [http://lists.ruby-it.org/mailman/listinfo/ml](http://lists.ruby-it.org/mailman/listinfo/ml)

Personalmente trovo più leggibile:

conds = {}  
conds.merge! {:category\_id =\> @selected\_cat} if @category != “tutte”  
… e così via.

In alternativa, proprio ieri ho scoperto squirrel  
([http://www.thoughtbot.com/projects/squirrel/](http://www.thoughtbot.com/projects/squirrel/)), che ti permette di  
scrivere:

@books = Book.find(:all) do  
category\_id == @selected\_cat if @category != “tutte”  
…  
order\_by title  
end

Andrea

---

<div class="post-metadata">

**Author:** ![softwarewin](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/5f9b8f/32.png) [@softwarewin](https://www.ruby-forum.com/u/softwarewin)\
**Post date:** [February 9, 2009, 9:15pm UTC](https://www.ruby-forum.com/t/ricerche-condizionate-in-base-alle-categorie/159850/7 "2009-02-09T21:15:18Z")

</div>

Pietro,  
grazie mille il tuo codice funziona alla perfezione:

conds = { }

conds[:category\_id] = @selected\_cat if @category != “tutte”  
conds[:nation\_id] = @selected\_nat if @nation != “tutte”  
conds[:author\_id] = @selected\_aut if @autor != “tutti”

@books = Book.find(:all, :conditions =\> conds, :order =\> ‘title’)

Se posso vorre Approfittare ancora della vostra disponibilitÃ :

dove posso trovare, in internet, una guida di riferimento che mostri  
comandi come questi.  
Ho il libro Agile Web D., in italiano acquistato, ma  
informazioni di questo tipo non ce ne sono proprio.

Grazie ancora.

Luigi

---

<div class="post-metadata">

**Author:** ![softwarewin](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/5f9b8f/32.png) [@softwarewin](https://www.ruby-forum.com/u/softwarewin)\
**Post date:** [February 10, 2009, 10:18am UTC](https://www.ruby-forum.com/t/ricerche-condizionate-in-base-alle-categorie/159850/8 "2009-02-10T10:18:29Z")

</div>

2009/2/9 Luigi M. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> dove posso trovare, in internet, una guida di riferimento che mostri  
> comandi come questi.  
> Ho il libro Agile Web D., in italiano acquistato, ma  
> informazioni di questo tipo non ce ne sono proprio.

quando si tratta di sapere come si usano i vari metodi, non c’è niente  
di meglio del reference.

di solito le leggo direttamente da [api.rubyonrails.org](http://api.rubyonrails.org). che so, voglio  
sapere i metodi di activerecord, cerco su google class activerecord.  
voglio sapere i metodi del controller, cerco class activecontroller.

ma la documentazione ce l’hai anche sul computer, basta che fai gem  
server e ti colleghi a localhost:8808 e trovi la documentazione di  
tutte le gem installate.

in inglese, purtroppo; in italiano non c’è praticamente niente.

questo quando so già più o meno cosa devi fare; quando invece cerco  
ispirazione, cioè, quando non ho già in mente la soluzione, tutto sta  
nel formulare la domanda nel modo giusto; una volta che lo si è fatto,  
la risposta la si trova subito. per me il maggior aiuto sono i canali  
irc e le ml in inglese: mi metto lì, cerco di riassumere il mio  
problema nel modo più chiaro e conciso possibile, e quando sono pronto  
a inviare cerco su google la frase che ho scritto; nove volte su  
dieci, non ho più bisogno di chiedere.

spesso, però, la miglior documentazione possibile è il codice: più  
si  
acquista familiarità col framework, più spesso capita di voler / dover  
dare un’occhiata ai sorgenti, cosa che aumenta ancora la  
familiarità.  
pietro

---

<div class="post-metadata">

**Author:** ![softwarewin](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/5f9b8f/32.png) [@softwarewin](https://www.ruby-forum.com/u/softwarewin)\
**Post date:** [February 10, 2009, 9:25pm UTC](https://www.ruby-forum.com/t/ricerche-condizionate-in-base-alle-categorie/159850/9 "2009-02-10T21:25:26Z")

</div>

Avrei un altro problema:  
per generare un URL spider-friendly ho nella view la seguente linea di  
comando:  
selection\_url(:nation=\>@nation,:category=\>@category,:author=\>@author)

dove selection\_url Ã¨ definito nel file routes.rb come segue:

map.selection  
‘libri/nazionalita/:nation/genere/:category/autore/:author/elenco.html’,  
:controller=\>‘book’, :action=\>‘selection’

in tal modo possono essere generati degli url del tipo:

[http://127.0.0.1:3000/libri/nazionalita/tutte/genere/commedia/autore/tutti/elenco.html](http://127.0.0.1:3000/libri/nazionalita/tutte/genere/commedia/autore/tutti/elenco.html)

[http://127.0.0.1:3000/libri/nazionalita/tutte/genere/commedia/autore/eliott-parker/elenco.html](http://127.0.0.1:3000/libri/nazionalita/tutte/genere/commedia/autore/eliott-parker/elenco.html)

[http://127.0.0.1:3000/libri/nazionalita/inglese/genere/commedia/autore/eliott-parker/elenco.html](http://127.0.0.1:3000/libri/nazionalita/inglese/genere/commedia/autore/eliott-parker/elenco.html)

etc…

Sarebbe bello, perÃ², nel caso in cui venga selezionata solo la categoria  
o solo l’autore o solo la nazionalitÃ o solo due di queste generare URL  
del tipo:

[http://127.0.0.1:3000/libri/genere/commedia.html](http://127.0.0.1:3000/libri/genere/commedia.html)

etc…

Mi ritrovo quindi a dover affrontare un problema simile a quello del  
primo post  
dove cioÃ¨ dovrei generare 8 condizioni if…end e altrettante 8 routes.

Che mi suggerite?

Grazie mille.

Luigi
