我有一个有三个型号的应用程序:
客户端
has_many :papers
纸张
has_many :pages
belongs_to :client
页
belongs_to :paper
我可以在代码中执行此操作:@paper.client.name
但是我无法做@paper.page.name
生成NoMethodError
我做错了什么?这些都是嵌套模型,其中客户端处于高级别。
答案 0 :(得分:1)
您的Paper
对象有很多页面,因此没有page
方法。如果要获取属于Paper
对象的所有页面的名称,则需要迭代pages
关联:
for page in @paper.pages
puts page.name
end
答案 1 :(得分:1)
虽然Marc的解释是绝对正确的,但是为了这个目的在Ruby中使用for
循环(而且实际上只是任何目的)并不完全是惯用的。 each
的使用情况更为常见:
@paper.pages.each { |page| puts page.name }
如果您只想要名称列表,可以使用map
:
@paper.pages.map(&:name)
map
将为集合中的每个项执行一个块,并返回结果数组。 &:name
是以下的简写:
@paper.pages.map { |page| page.name }
Enumerable
在惯用的Ruby中起着重要作用。
并且,不要太令人困惑,Rails中还有pluck
来获取单个属性的数组,但是如果它是你想要的唯一的东西你应该只使用它来自收藏:
@paper.pages.pluck(:name)