Jeśli mam obiektu z kolekcji obiektów podrzędnych w ActiveRecord, tjRuby rodzaje zbiorów w ActiveRecord
class Foo < ActiveRecord::Base
has_many :bars, ...
end
i próbie uruchomienia Array find
metodę przeciwko tej kolekcji:
foo_instance.bars.find { ... }
Otrzymuję:
ActiveRecord::RecordNotFound: Couldn't find Bar without an ID
Zakładam, że to dlatego, że ActiveRecord przejął find
Metoda dla własnych celów. Teraz mogę użyć detect
i wszystko jest w porządku. Jednak, aby zaspokoić własne ciekawość, próbowałem użyć metaprogramowanie jawnie ukraść metodę find
powrotem na jednym cyklu:
unbound_method = [].method('find').unbind
unbound_method.bind(foo_instance.bars).call { ... }
i otrzymuję ten błąd:
TypeError: bind argument must be an instance of Array
tak wyraźnie Ruby nie myśli foo_instance.bars
jest tablicą i jeszcze:
foo_instance.bars.instance_of?(Array) -> true
Czy ktoś może mi pomóc z wyjaśnieniem tego i sposób poruszania się po niej z metaprogramm ing?
Aby to wyjaśnić, metoda .all faktycznie pobiera wszystkie skojarzone modele, które mogą mieć ogromny wpływ na pamięć w zależności od typu powiązania. Na przykład, jeśli był to użytkownik has_many: posty, możliwe, że pobierasz całą historię księgowania użytkownika, która może być znaczną ilością danych. Tam, gdzie to możliwe, spróbuj skonstruować wywołanie find z warunkami lub nazwanymi zakresami dla lepszej wydajności. – tadman