Forum: Italian Ruby user group metodo where nell'associazione has_many :through.

Posted by Msan Msan (msan)
on 2012-05-23 18:06
(Received via mailing list)
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?
Posted by gabriele renzi (Guest)
on 2012-05-23 20:48
(Received via mailing list)
On Wed, May 23, 2012 at 6:06 PM, Mauro <mrsanna1@gmail.com> 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
work: circleme.com
Posted by Msan Msan (msan)
on 2012-05-25 08:37
(Received via mailing list)
2012/5/23 gabriele renzi <rff.rff@gmail.com>:
>> 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
Posted by gabriele renzi (Guest)
on 2012-05-25 12:04
(Received via mailing list)
On Fri, May 25, 2012 at 8:36 AM, Mauro <mrsanna1@gmail.com> wrote:
> 2012/5/23 gabriele renzi <rff.rff@gmail.com>:
>>> 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
work: circleme.com
Please log in before posting. Registration is free and takes only a minute.
Existing account (Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
No account? Register here.