Wie wird diese Ruby-Klassenmethode aufgerufen?

Auf einer Leinwand angegossenExportieren von CSV aus einer Schienen-App, Ryan Bates präsentierte den folgenden einfachen Code.

Ich versuche herauszufinden, wie die Klassenmethode Product :: to_csv in Zeile 5 von ProductController.rb aufgerufen wird, da sie nicht den normalen Ruby-Regeln zu entsprechen scheint.

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

Da to_csv eine Klassenmethode ist, würde ich erwarten, dass der Aufruf wie Product :: to_csv () aussieht.

Laut Dokumentation ist @products eine Instanz von ActiveRecord :: Relation. Warum werden durch an eine Instanz von ActiveRecord :: Relation gesendete Nachrichten Methoden für das Produktklassenobjekt aufgerufen? Um es noch seltsamer zu machen, führt das Umbenennen von to_csv in einen beliebigen Namen sowohl im Absender als auch im Empfänger zu NoMethodError. Vielleicht gibt es also etwas Magisches, das auf Namen basiert, die mit to_ beginnen.

Vermisse ich etwas Offensichtliches? Jede Klarstellung wäre sehr dankbar.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage