# Metodo where nell'associazione has\_many :through

**URL:** <https://www.ruby-forum.com/t/metodo-where-nellassociazione-has-many-through/219974>\
**Category:** IT\
**Created:** [May 23, 2012, 6:06pm UTC](https://www.ruby-forum.com/t/metodo-where-nellassociazione-has-many-through/219974 "2012-05-23T18:06:53Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![dubstep](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/cdc98d/32.png) [@dubstep](https://www.ruby-forum.com/u/dubstep)\
**Post date:** [May 23, 2012, 6:06pm UTC](https://www.ruby-forum.com/t/metodo-where-nellassociazione-has-many-through/219974/1 "2012-05-23T18:06:53Z")

</div>

Se ho:

Manager  
has\_many :managements  
has\_many :companies, :through =\> :managements

man=Manager.find(1)

man.managements mi restituisce un array giusto?  
Essendo un array presumo possa utilizzare tutti i metodi validi per un  
array.  
Per la classe Array non e’ previsto il metodo “where”, e allora perche’  
man.managements.where(:company\_id =\> “101”) funziona?

---

<div class="post-metadata">

**Author:** ![msan](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/3ab097/32.png) [@msan](https://www.ruby-forum.com/u/msan)\
**Post date:** [May 23, 2012, 8:48pm UTC](https://www.ruby-forum.com/t/metodo-where-nellassociazione-has-many-through/219974/2 "2012-05-23T20:48:14Z")

</div>

On Wed, May 23, 2012 at 6:06 PM, Mauro [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> Se ho:
> 
> Manager  
> has\_many :managements  
> has\_many :companies, :through =\> :managements
> 
> man=Manager.find(1)
> 
> man.managements mi restituisce un array giusto?

no 🙂  
Ti restituisce un ActiveRecord::Relation.  
Finch continui a chimare metodi di questa classe, non succede niente,  
ma quando chiamo qualche metodo di array (o un banale to\_s) avviene il  
concreto fetch dei dati e le operazioni seguenti avvengono sull’array.

> Essendo un array presumo possa utilizzare tutti i metodi validi per un array.

probbilmente ti ha fregato irb che causa il fetch dei dati. Prova

man.managements.class

> Per la classe Array non e’ previsto il metodo “where”, e allora perche’  
> man.managements.where(:company\_id =\> “101”) funziona?

vedi sopra.

–  
twitter: @riffraff  
blog (en, it): www.riffraff.info [riffraff.blogsome.com](http://riffraff.blogsome.com)  
work: [circleme.com](http://circleme.com)

---

<div class="post-metadata">

**Author:** ![msan](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/3ab097/32.png) [@msan](https://www.ruby-forum.com/u/msan)\
**Post date:** [May 25, 2012, 8:37am UTC](https://www.ruby-forum.com/t/metodo-where-nellassociazione-has-many-through/219974/3 "2012-05-25T08:37:09Z")

</div>

2012/5/23 gabriele renzi [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> > man.managements mi restituisce un array giusto?
> 
> no 🙂  
> probbilmente ti ha fregato irb che causa il fetch dei dati. Prova
> 
> man.managements.class

irb(main):004:0\> man.managements.class  
=\> Array

---

<div class="post-metadata">

**Author:** ![msan](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/3ab097/32.png) [@msan](https://www.ruby-forum.com/u/msan)\
**Post date:** [May 25, 2012, 12:04pm UTC](https://www.ruby-forum.com/t/metodo-where-nellassociazione-has-many-through/219974/4 "2012-05-25T12:04:20Z")

</div>

On Fri, May 25, 2012 at 8:36 AM, Mauro [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> 2012/5/23 gabriele renzi [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):
> 
> > > man.managements mi restituisce un array giusto?
> > 
> > no 🙂  
> > probbilmente ti ha fregato irb che causa il fetch dei dati. Prova
> > 
> > man.managements.class
> 
> irb(main):004:0\> man.managements.class  
> =\> Array

d’ho, apparentemente non come me lo ricordo io, e quello veramente  
un array.

Oppure no?

Vedi la versione hardcore:

> > ms= man.managements;  
> > ms.class.superclass.instance\_method(:class).bind(ms).call  
> > =\> ActiveRecord::Associations::HasManyAssociation  
> > ms.class.superclass  
> > =\> Object

Che equivale a dire: se uso il metodo “class” come definito in  
object (quello usato in tutti gli oggetti “normali”) allora questo  
oggetto “magico” di ActiveRecord mi dice la verit, e non un Array.

Semplicemente, il metodo #class, come tanti altri truccato per farlo  
funzionare come un array.

Per conferma,

man.managements.ancestors

dovrebbe darti una quarantina di oggetti (58 da me),  
tra cui puoi vedere che non c’ Array, mentre

.ancestors

ti da un errore e

.class.ancestors

dovrebbe dartene una decina (14 da me) tra cui ovviamente il primo  
Array

–  
twitter: @riffraff  
blog (en, it): www.riffraff.info [riffraff.blogsome.com](http://riffraff.blogsome.com)  
work: [circleme.com](http://circleme.com)
