Методы класса в Ruby on Rails 3 - я полностью потерян! - PullRequest
5 голосов
/ 09 марта 2011

Фон здесь .

В приведенной выше ссылке приведен следующий пример:

class << self
  def by_author(author)
    where(:author_id => author.id)
  end
end

Помимо того, что этот синтаксис был чужим для новичка, такого как я - Я всегда думал, что методы класса были определены с помощью def self.my_class_method - где я могу найти документацию о методах класса в Ruby on Rails?

Насколько я знаю, методы класса всегда вызываются в самом классе (MyClass.my_class_method), но если методы класса в Rails являются цепочечными, кажется, что здесь должно происходить что-то еще!

Edit:

Полагаю, меня обманули, комментируя синтаксис методов класса. Я действительно спрашиваю, как Rails делает метод класса цепным - я понимаю, как работает цепочка методов, но не то, как Rails может позволить вам связывать методы класса , фактически не возвращая сам объект класса после каждого «звена» в цепочке.

Ответы [ 3 ]

5 голосов
/ 09 марта 2011

Методы класса в 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 на вызванный метод, и если да, то вызывает это.

4 голосов
/ 09 марта 2011

Наличие класса << self также является другим способом определения ваших методов, чтобы вам не приходилось вызывать def self.my_method или def MyClass.my_method для каждого метода, который вы определяете как метод класса. Вместо звонка </p>

  def self.my_method1
  end

  def self.my_method2
  end
class &#60;&#60; self
  def my_method1
  end

  def my_method2
  end
end

Ура! * * 1005

2 голосов
/ 06 сентября 2012

Следующие два бита кода эквивалентны.

Использование self.method:

class Hello
  def self.world
    puts "Hello, World!"
  end
end

Использование class << self:

class Hello
  class << self
    def world
      puts "Hello, World!"
    end
  end
end

Единственная разницаудобочитаемость, а также простота рефакторинга.Техника class << self часто используется при метапрограммировании.

Существует еще один поток, объясняющий это. class << self vs self.method с Ruby: что лучше? </a>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...