ruby-on-rails - Ruby on Rails 3 中的类方法——我完全迷路了!

标签 ruby-on-rails ruby

背景 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) 上调用,但如果 R​​ails 中的类方法是可链接的,似乎必须进行其他操作在这里!

编辑:

我想我通过对类方法的语法发表评论有点被骗了。我真的想问 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 查询(例如,使用 whereorder 等)。这是实现的,因为这些方法中的每一个都返回一个 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/

相关文章:

ruby-on-rails - rails : Shopify integration withouth a shopify app?

javascript - rails : dynamic select on multistep form not keeping selected

ruby-on-rails - Stripe : Cannot charge a customer that has no active card

ruby-on-rails - before_filter或rescue创建新记录

ruby-on-rails - 如何使用 Factory girl 创建管理员角色?

html - Bootstrap 复选框未在表单中对齐

Ruby NET::SCP 包含通配符

ruby - 类型错误 : no implicit conversion of Hash into String

jquery - Spree Commerce 号码输入 - JQuery

ruby-on-rails - 虚拟 ruby - 没有这样的文件或目录 - main.rb (LoadError)