我有一个包含三个模型的应用程序:
客户
has_many :papers
纸
has_many :pages
belongs_to :client
页
belongs_to :paper
我可以在代码中做到这一点:@paper.client.name
但我无法做@paper.page.name
NoMethodError 产生
我做错了什么?这些都是嵌套模型,其中 Client 处于较高级别。
我有一个包含三个模型的应用程序:
客户
has_many :papers
纸
has_many :pages
belongs_to :client
页
belongs_to :paper
我可以在代码中做到这一点:@paper.client.name
但我无法做@paper.page.name
NoMethodError 产生
我做错了什么?这些都是嵌套模型,其中 Client 处于较高级别。
虽然 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 中起着重要作用。
而且,不要太混乱,pluck
Rails 中也有用于获取单个属性的数组,但只有当它是您想要从集合中获得的唯一东西时才应该使用它:
@paper.pages.pluck(:name)
您的Paper
对象有很多页面,因此没有page
方法。如果要获取属于某个Paper
对象的所有页面的名称,则需要遍历pages
关联:
for page in @paper.pages
puts page.name
end