我正在研究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?
?
答案 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?
结束语:当你调用任何方法时,你可以从某个对象中调用它。