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

2024-03-19

背景here http://www.railway.at/2010/03/09/named-scopes-are-dead/.

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

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 是如何制作的类方法chainable — 我理解方法链接是如何工作的,但不知道 Rails 如何允许你链接类方法在链中的每个“链接”之后实际上没有返回类对象本身。


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

This 关于 Ruby 单例的文章 http://www.contextualdevelopment.com/articles/2008/ruby-singleton解释得很好。

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

bar = foo.do_something.do_more

相当于:

tmp = foo.do_something
bar = tmp.do_more

在 Rails 中,这种可链接性最常用于构建 SQL 查询(例如,使用where or order, ETC。)。这是因为每个方法都返回一个ActiveRecord关系 http://api.rubyonrails.org/classes/ActiveRecord/Relation.html.

原因

 foo.scoped.my_foo_class_method

作品是因为ActiveRecord::Relation#method_missing https://github.com/rails/rails/blob/master/activerecord/lib/active_record/relation.rb#L393执行以下操作:

elsif @klass.respond_to?(method)
  scoping { @klass.send(method, *args, &block) }

它检查 ActiveRecord 类是否响应所调用的方法,如果是,则调用该方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Ruby on Rails 3 中的类方法 — 我完全迷失了! 的相关文章

随机推荐