Ruby on Rails 3中的类方法 - 我完全迷失了!

Clo*_*boy 5 ruby ruby-on-rails

背景在这里.

在上面的链接中,给出了以下示例:

class << self
  def by_author(author)
    where(:author_id => author.id)
  end
end
Run Code Online (Sandbox Code Playgroud)

除了这个语法对像我这样的初学者来说是陌生的 - 我一直认为类方法是用def self.my_class_method - 在哪里可以找到Ruby on Rails中的类方法的文档?

据我所知,类方法总是在类本身(MyClass.my_class_method)上调用,但是如果Rails中的类方法是可链接的,那么似乎必须在其他地方进行其他操作!

编辑:

我想通过对类方法的语法做出评论来欺骗我.我真的在问Rails如何使类方法可链接 - 我理解方法链如何工作,但不知道Rails如何允许链接类方法而不在链中的每个"链接"之后实际返回类对象本身.

And*_*all 5

Ruby中的类方法实际上只是单例类的成员,并且class << self涉及直接打开单例类并添加到它,从而无需在每个方法定义中声明它.

条关于Ruby单身做得很好解释.

至于类方法是可链接的,这不是特定于类方法的东西,第二个方法调用只是在从第一个返回的对象上调用.例如:

bar = foo.do_something.do_more
Run Code Online (Sandbox Code Playgroud)

相当于:

tmp = foo.do_something
bar = tmp.do_more
Run Code Online (Sandbox Code Playgroud)

在Rails中,这种可链接性最常用于构建SQL查询(例如,使用whereorder等).这是因为每个方法都返回一个ActiveRecord关系.

原因

 foo.scoped.my_foo_class_method
Run Code Online (Sandbox Code Playgroud)

工作是因为ActiveRecord::Relation#method_missing做了以下事情:

elsif @klass.respond_to?(method)
  scoping { @klass.send(method, *args, &block) }
Run Code Online (Sandbox Code Playgroud)

哪个检查ActiveRecord类是否响应被调用的方法,如果是,则调用它.