rails嵌套模型导航

时间:2013-01-29 00:02:33

标签: ruby-on-rails ruby

我有一个有三个型号的应用程序:

客户端

has_many :papers

纸张

has_many :pages
belongs_to :client

belongs_to :paper

我可以在代码中执行此操作:@paper.client.name

但是我无法做@paper.page.name生成NoMethodError

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

2 个答案:

答案 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)