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如何允许链接类方法而不在链中的每个"链接"之后实际返回类对象本身.
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查询(例如,使用where或order等).这是因为每个方法都返回一个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类是否响应被调用的方法,如果是,则调用它.
| 归档时间: |
|
| 查看次数: |
5095 次 |
| 最近记录: |