0

我有一个包含三个模型的应用程序:

客户

has_many :papers

has_many :pages
belongs_to :client

belongs_to :paper

我可以在代码中做到这一点:@paper.client.name

但我无法做@paper.page.nameNoMethodError 产生

我做错了什么?这些都是嵌套模型,其中 Client 处于较高级别。

4

2 回答 2

1

虽然 Marc 的解释是绝对正确的,但for在 Ruby 中为此目的(实际上几乎是任何目的)使用循环并不是惯用的。的用法each更为常见:

@paper.pages.each { |page| puts page.name }

如果您只想要名称列表,可以使用map

@paper.pages.map(&:name)

map将为集合中的每个项目执行一个块并返回结果数组。The&:name是以下的简写:

@paper.pages.map { |page| page.name }

Enumerable在惯用的 Ruby 中起着重要作用。

而且,不要混乱,pluckRails 中也有用于获取单个属性的数组,但只有当它是您想要从集合中获得的唯一东西时才应该使用它:

@paper.pages.pluck(:name)
于 2013-01-29T02:00:02.610 回答
1

您的Paper对象有很多页面,因此没有page方法。如果要获取属于某个Paper对象的所有页面的名称,则需要遍历pages关联:

for page in @paper.pages
    puts page.name
end
于 2013-01-29T00:05:17.107 回答