¿Cómo se invoca este método de clase Ruby?

En una pantalla emitidaExportando CSV desde una aplicación de rieles, Ryan Bates presentó el siguiente código simple.

Estoy tratando de averiguar cómo el método de clase Product :: to_csv realmente se invoca en la línea 5 de ProductController.rb, ya que no parece seguir las reglas normales de Ruby.

product.rb

1 class Product < ActiveRecord::Base   
2   def self.to_csv(options = {})
3     ...
4   end
5 end

products_controller.rb

1 class ProductsController < ApplicationController
2  def index
3    @products = Product.order(:name)
4    respond_to do |format|
5      format.csv { send_data @products.to_csv }
6      ...
7    end
8  end
9 end

Dado que to_csv es un método de clase, esperaría que la invocación se vea como Producto :: to_csv ().

De acuerdo con la documentación, @products es una instancia de ActiveRecord :: Relation. ¿Por qué los mensajes enviados a una instancia de ActiveRecord :: Relation hacen que los métodos en el objeto de la clase Product sean invocados? Para hacerlo aún más extraño, cambiar el nombre de to_csv a un nombre arbitrario, tanto en el remitente como en el receptor, lleva a NoMethodError, por lo que tal vez haya algo de magia basada en nombres que comiencen con to_?

¿Me estoy perdiendo algo obvio? Cualquier aclaración sería muy apreciada.

Respuestas a la pregunta(2)

Su respuesta a la pregunta