# Query personalizzata

**URL:** <https://www.ruby-forum.com/t/query-personalizzata/141498>\
**Category:** IT\
**Created:** [June 26, 2008, 1:34pm UTC](https://www.ruby-forum.com/t/query-personalizzata/141498 "2008-06-26T13:34:35Z")\
**Posts on this page:** 9\
**Page:** 1

<div class="post-metadata">

**Author:** ![zacx85](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/z/e56c9b/32.png) [@zacx85](https://www.ruby-forum.com/u/zacx85)\
**Post date:** [June 26, 2008, 1:34pm UTC](https://www.ruby-forum.com/t/query-personalizzata/141498/1 "2008-06-26T13:34:35Z")

</div>

Sicuramente sono ancora troppo fresco in rails, ma mi sembra di aver  
capito  
che la controparte dell’estrema semplicitÃ nell’uso di ActiveRecord sia  
la  
difficolta’ nel personalizzare le query.

Ad esempio ipotiziamo di dover gestire una videoteca e quindi tutti i  
film appartenenti. Voglio creare al volo un PDF con determinati  
paramentri, tipo  
anno di uscita, regista, attore… e tutte ste cose qua. Per ora ho  
risolto il problema della query personalizzata in questo modo:

if params[:catalogue][:kind] != nil && params[:catalogue][:kind] != “”  
kinds = params[:catalogue][:kind].each { |kind|  
@cond \<\< " OR " if @cond!=""  
@cond \<\< “kind\_id = #{kind}”  
}  
@to\_clean = false  
end

if params[:catalogue][:shortCast] != “”  
@cond \<\< " AND " if @cond!=""  
@cond \<\< “shortCast LIKE ‘%#{params[:catalogue][:shortCast]}%’”  
@to\_clean = false  
end

if params[:catalogue][:year] != “”  
@cond \<\< " AND " if @cond!=""  
@cond \<\< “year LIKE #{params[:catalogue][:year]}”  
@to\_clean = false  
end

E quindi poi potevo fare cosÃ¬:

@filmP = Film.find(:all, :conditions =\> @cond)

Ora perÃ² mi si Ã¨ posto l’ennesimo problema.  
Di ogni genere devi prendere al max 8 film.

Secondo voi dovrei far uso della clausola HAVING combinata con il GROUP  
BY ?!!?

---

<div class="post-metadata">

**Author:** ![zacx85](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/z/e56c9b/32.png) [@zacx85](https://www.ruby-forum.com/u/zacx85)\
**Post date:** [June 26, 2008, 2:58pm UTC](https://www.ruby-forum.com/t/query-personalizzata/141498/2 "2008-06-26T14:58:43Z")

</div>

> Ora perÃ² mi si Ã¨ posto l’ennesimo problema.  
> Di ogni genere devi prendere al max 8 film.
> 
> Secondo voi dovrei far uso della clausola HAVING combinata con il GROUP  
> BY ?!!?

Ciao Ale,

Probabilmente ho capito male… ma non puoi utilizzare :limit =\> 8

Andrea

---

<div class="post-metadata">

**Author:** ![zacx85](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/z/e56c9b/32.png) [@zacx85](https://www.ruby-forum.com/u/zacx85)\
**Post date:** [June 26, 2008, 3:05pm UTC](https://www.ruby-forum.com/t/query-personalizzata/141498/3 "2008-06-26T15:05:21Z")

</div>

Andrea R. wrote:

> > Ora perÃ² mi si Ã¨ posto l’ennesimo problema.  
> > Di ogni genere devi prendere al max 8 film.
> > 
> > Secondo voi dovrei far uso della clausola HAVING combinata con il GROUP  
> > BY ?!!?
> 
> Ciao Ale,
> 
> Probabilmente ho capito male… ma non puoi utilizzare :limit =\> 8
> 
> Andrea

Ciao Andrea,  
si non Ã¨ quello che dicevo io… A me servono piÃ¹ di 8 records, ma  
vorrei ad esempio 8 films della categoria Animazione, poi 8 films della  
categoria Triller, poi 8 della cat Animazine, e cosÃ¬ via… quindi alla  
fine potrei anche avere 64 films, ma non ne voglio piÃ¹ di 8 per genere.  
Tutto ciÃ² senza esser costretto di fare piÃ¹ queries…

---

<div class="post-metadata">

**Author:** ![zacx85](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/z/e56c9b/32.png) [@zacx85](https://www.ruby-forum.com/u/zacx85)\
**Post date:** [June 26, 2008, 3:21pm UTC](https://www.ruby-forum.com/t/query-personalizzata/141498/4 "2008-06-26T15:21:15Z")

</div>

On Jun 26, 2008, at 3:05 PM, Ale Z. wrote:

> Ciao Andrea,  
> si non è quello che dicevo io… A me servono più di 8 records, ma  
> vorrei ad esempio 8 films della categoria Animazione, poi 8 films  
> della  
> categoria Triller, poi 8 della cat Animazine, e così via… quindi  
> alla  
> fine potrei anche avere 64 films, ma non ne voglio più di 8 per  
> genere.  
> Tutto ciò senza esser costretto di fare più queries…

Mi baso piu’ sull’esperienza che sui (pochi) ricordi di algebra  
relazionale, e  
quindi potrei sbagliarmi, ma non mi sembra che sia possibile fare  
tutto con una sola query.  
Perche’ non vuoi fare piu’ query? La soluzione sarebbe piu’ che banale.

S.

---

<div class="post-metadata">

**Author:** ![zacx85](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/z/e56c9b/32.png) [@zacx85](https://www.ruby-forum.com/u/zacx85)\
**Post date:** [June 26, 2008, 6:46pm UTC](https://www.ruby-forum.com/t/query-personalizzata/141498/5 "2008-06-26T18:46:16Z")

</div>

class Movie \< ActiveRecord::Base  
has\_and\_belongs\_to\_many :categories  
end

class Category \< ActiveRecord::Base  
has\_and\_belongs\_to\_many :movies  
has\_many :most\_recent\_movies,  
:class\_name =\> ‘Movie’, :limit =\> 10,  
:order =\> ‘created\_at DESC’

def self.search(names)  
find(:all, :conditions =\> [‘name IN(?)’, names],  
:include =\> :most\_recent\_movies)  
end  
end

Category.search([‘Action’, ‘Fantasy’])

Ritorna le categorie, con già caricati gli ultimi dieci film, il che  
significa che il tutto viene risolto in una sola query. Guarda il file  
di log 😉

## Luca

blog: [www.lucaguidi.com](http://www.lucaguidi.com)  
Pro-Netics: [www.pro-netics.com](http://www.pro-netics.com)  
Sourcesense - making sense of Open Source: [www.sourcesense.com](http://www.sourcesense.com)

---

<div class="post-metadata">

**Author:** ![zacx85](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/z/e56c9b/32.png) [@zacx85](https://www.ruby-forum.com/u/zacx85)\
**Post date:** [June 26, 2008, 4:27pm UTC](https://www.ruby-forum.com/t/query-personalizzata/141498/6 "2008-06-26T16:27:47Z")

</div>

Ale Z. wrote:

> Andrea R. wrote:
> 
> > > Ora perÃ² mi si Ã¨ posto l’ennesimo problema.  
> > > Di ogni genere devi prendere al max 8 film.
> > > 
> > > Secondo voi dovrei far uso della clausola HAVING combinata con il GROUP  
> > > BY ?!!?
> > 
> > Ciao Ale,
> > 
> > Probabilmente ho capito male… ma non puoi utilizzare :limit =\> 8
> > 
> > Andrea
> 
> Ciao Andrea,  
> si non Ã¨ quello che dicevo io… A me servono piÃ¹ di 8 records, ma  
> vorrei ad esempio 8 films della categoria Animazione, poi 8 films della  
> categoria Triller, poi 8 della cat Animazine, e cosÃ¬ via… quindi alla  
> fine potrei anche avere 64 films, ma non ne voglio piÃ¹ di 8 per genere.  
> Tutto ciÃ² senza esser costretto di fare piÃ¹ queries…

Comprendo…

Allora temo che ti servano almeno due query anidate… una per i gruppi  
ed una per i limiti.

Andrea

---

<div class="post-metadata">

**Author:** ![zacx85](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/z/e56c9b/32.png) [@zacx85](https://www.ruby-forum.com/u/zacx85)\
**Post date:** [June 26, 2008, 11:33pm UTC](https://www.ruby-forum.com/t/query-personalizzata/141498/7 "2008-06-26T23:33:57Z")

</div>

On Jun 26, 2008, at 6:44 PM, Luca G. wrote:

> def self.search(names)  
> di log 😉  
> A me sembra un po’ strano… ci fai vedere questa query?

S.

---

<div class="post-metadata">

**Author:** ![zacx85](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/z/e56c9b/32.png) [@zacx85](https://www.ruby-forum.com/u/zacx85)\
**Post date:** [June 27, 2008, 11:18am UTC](https://www.ruby-forum.com/t/query-personalizzata/141498/8 "2008-06-27T11:18:47Z")

</div>

Stefano C. wrote:

> On Jun 26, 2008, at 6:44 PM, Luca G. wrote:
> 
> > def self.search(names)  
> > di log 😉  
> > A me sembra un po’ strano… ci fai vedere questa query?
> 
> S.

Dici a me!?!?

---

<div class="post-metadata">

**Author:** ![zacx85](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/z/e56c9b/32.png) [@zacx85](https://www.ruby-forum.com/u/zacx85)\
**Post date:** [June 27, 2008, 11:25am UTC](https://www.ruby-forum.com/t/query-personalizzata/141498/9 "2008-06-27T11:25:04Z")

</div>

Stefano C. wrote:

> A me sembra un po’ strano… ci fai vedere questa query?

Per la fretta ho sbagliato due cose:

1. Nella classe Movie anche la seconda macro è habtm, non hm
2. Non mi sono accorto che l’eager loading non funziona bene, cioè  
esegue due query, una per le categorie, l’altra per caricare tutti i  
relativi movies, ignorando, tra l’altro, il limit imposto da  
most\_recent\_movies.

SELECT \* FROM “categories” WHERE (name in (‘Action’,‘Fantasy’))

SELECT “movies”.\*, t0.category\_id as \_parent\_record\_id FROM “movies”  
INNER JOIN “categories\_movies” as t0 ON “movies”.id = t0.movie\_id WHERE  
(t0.category\_id IN (1,2))

## Luca

blog: [www.lucaguidi.com](http://www.lucaguidi.com)  
Pro-Netics: [www.pro-netics.com](http://www.pro-netics.com)  
Sourcesense - making sense of Open Source: [www.sourcesense.com](http://www.sourcesense.com)
