背景 here .
在上面的链接中,给出了以下示例:
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 中的类方法是可链接的,似乎必须进行其他操作在这里!
编辑:
我想我通过对类方法的语法发表评论有点被骗了。我真的想问 Rails 如何使 类方法 可链接 — 我了解方法链接的工作原理,但不知道 Rails 如何允许您链接 类方法 而无需实际返回类链中每个“链接”之后的对象本身。
最佳答案
Ruby 中的类方法实际上只是单例类的成员,并且做 class << self
涉及直接打开单例类并添加到其中,无需在每个方法定义中声明它。
这article on Ruby singletons解释得很好。
至于类方法是可链接的,这不是类方法特有的东西,第二个方法调用只是在第一个方法返回的对象上调用。例如:
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 类是否响应调用的方法,如果是,则调用它。
关于ruby-on-rails - Ruby on Rails 3 中的类方法——我完全迷路了!,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5240911/