Si tengo un objeto con una colección de objetos secundarios en ActiveRecord, es decirtipos de Ruby de colecciones en ActiveRecord
class Foo < ActiveRecord::Base
has_many :bars, ...
end
y trato de ejecutar el método de matriz find
contra esa colección:
foo_instance.bars.find { ... }
Recibo:
ActiveRecord::RecordNotFound: Couldn't find Bar without an ID
Supongo que esto se debe a que ActiveRecord ha secuestrado el find
método para sus propios fines. Ahora, puedo usar detect
y todo está bien. Sin embargo, para satisfacer mi propia curiosidad, he tratado de utilizar metaprogramming robar explícitamente el método find
de vuelta para una carrera:
unbound_method = [].method('find').unbind
unbound_method.bind(foo_instance.bars).call { ... }
y recibo este error:
TypeError: bind argument must be an instance of Array
tan claramente Rubí no piensa foo_instance.bars
es una matriz y, sin embargo:
foo_instance.bars.instance_of?(Array) -> true
¿Puede alguien ayudarme con una explicación de esto y de una manera de conseguir alrededor de él con metaprogramm ¿En g?
Para aclarar aquí, el método .all realmente recupera todos los modelos asociados que pueden tener un gran impacto de memoria dependiendo del tipo de asociación. Por ejemplo, si se trata de User has_many: posts, es posible que esté recuperando el historial de publicación completo de un usuario, que podría ser una gran cantidad de datos. Donde sea posible, intente construir una llamada de búsqueda con condiciones o ámbitos nombrados para un mejor rendimiento. – tadman