定义类似于rails的链式ruby方法定义

时间:2016-07-25 13:55:06

标签: ruby-on-rails ruby activerecord

我正在研究Rails文档。在associations documentation中,他们指定了带有链的方法定义,如下所示:

  

项目#portfolio.nil?

这对我来说似乎很奇怪。看来有一个实例方法定义有一个链式方法。例如:Project#portfolio.nil?似乎将定义一个如下所示的实例方法:

class Project < ActiveRecord::Base

  def portfolio.nil?
    ...
  end
end

我之前从未见过像这样定义的实例方法:其中在实际的实例方法定义中指定了一个链。我尝试用直的红宝石复制它,我无法让它工作。

class Dog
  def speak
   puts "woof woof"
  end

  def speak.fetch
    puts "go get the ball!"
  end
end

然而,这不起作用。有一个NameError

  

NameError:未定义的局部变量或方法`speak&#39; for Dog:Class

如果确实有效:那我会试试Dog.new.speak.fetch。我不确定它会回归什么。也许它会回归:

=> woof woof!
=> go get the ball!

问题:是否有可能以某种方式定义带有链的实例方法定义?如果不是:铁道如何做到这一点?以Project#portfolio.nil?为例:Rails如何定义#portfolio.nil?

2 个答案:

答案 0 :(得分:3)

这只是一个错误(或者,我们称之为一个有点误导性的措辞)在Rails文档中。引用http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html

  

项目类现在具有以下方法(以及更多)以简化遍历和操纵其关系:   Project#portfolio, Project#portfolio=(portfolio), Project#portfolio.nil?

该列表中的第三个条目显然只是提示nil是关系属性的有效值。

(问题的答案是“不”,你不能在一个def中用Ruby定义一系列方法。)

答案 1 :(得分:0)

让我们从一个基本的东西开始:

  

在Ruby中,没有基元。一切都是对象。都有一个   共同的祖先,对象类。

因此,当您使用dot notation时,您可以从object调用方法。

当您使用nil?时,表示您调用检查object等于nil的方法。您可以从任何对象调用此方法:

Object.nil? # => false

在您的代码中,您拥有Project模型,该模型具有关联Portofolio

class Project < ActiveRecord::Base
  belongs_to :portfolio
end

文档说:

  

Belongs_to:指定与另一个类的一对一关联。

     

将添加方法以检索和查询单个关联   对象,此对象拥有一个id:association是一个   作为name参数传递的符号的占位符,所以belongs_to   :作者会添加其他作者.nil?。

例如:

project = Project.first
# this will get portfolio from database by foreign key
puts project.portfolio  
# You can check that there is no records in database
puts project.portfolio.nil?

结束语:当你调用任何方法时,你可以从某个对象中调用它。