Metodo where nell'associazione has_many :through

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?

On Wed, May 23, 2012 at 6:06 PM, Mauro [email protected] wrote:

Se ho:

Manager
has_many :managements
has_many :companies, :through => :managements

man=Manager.find(1)

man.managements mi restituisce un array giusto?

no :slight_smile:
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
work: circleme.com

2012/5/23 gabriele renzi [email protected]:

man.managements mi restituisce un array giusto?

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

man.managements.class

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

On Fri, May 25, 2012 at 8:36 AM, Mauro [email protected] wrote:

2012/5/23 gabriele renzi [email protected]:

man.managements mi restituisce un array giusto?

no :slight_smile:
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
work: circleme.com