Методы класса в Ruby на самом деле являются просто членами одноэлементного класса, и выполнение class << self
предполагает непосредственное открытие одноэлементного класса и добавление к нему, исключая необходимость объявлять его в каждом определении метода.
Это статья о синглетах Ruby хорошо объясняет.
Поскольку методы класса являются цепочечными, это не является чем-то специфичным для методов класса, второй вызов метода просто вызывается для объектавернулся с первого.Например:
bar = foo.do_something.do_more
эквивалентно:
tmp = foo.do_something
bar = tmp.do_more
В Rails эта цепочность чаще всего используется для построения запросов SQL (например, с where
или order
,так далее.).Это достигается за счет того, что каждый из этих методов возвращает ActiveRecord Relation .
Причина, по которой
foo.scoped.my_foo_class_method
работает, заключается в выполнении ActiveRecord::Relation#method_missing
следующее:
elsif @klass.respond_to?(method)
scoping { @klass.send(method, *args, &block) }
Который проверяет, отвечает ли класс ActiveRecord на вызванный метод, и если да, то вызывает это.