0

私は3つのモデルを持つアプリを持っています:

クライアント

has_many :papers

論文

has_many :pages
belongs_to :client

ページ

belongs_to :paper

私はこれをコードで行うことができます:@paper.client.name

しかし、@paper.page.nameNoMethodErrorが生成されることはできません

私が間違っていることは何ですか?これらはすべてネストされたモデルであり、クライアントは高レベルです。

4

2 に答える 2

1

Paperオブジェクトには多くのページがあるため、メソッドはありませんpage。オブジェクトに属するすべてのページの名前を取得する場合は、関連付けPaperを繰り返す必要があります。pages

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

マークの説明は絶対に正しいですが、この目的のために(そして実際にはほぼすべてのfor目的のために) Rubyでループを使用することは、まったく慣用的ではありません。の使用法ははるかに一般的です:each

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

名前のリストが必要な場合は、次を使用できますmap

@paper.pages.map(&:name)

mapコレクション内の各アイテムに対してブロックを実行し、結果の配列を返します。の&:name省略形は次のとおりです。

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

Enumerable慣用的なRubyで大きな役割を果たします。

また、混乱を招きすぎpluckないように、Railsには単一の属性の配列を取得するための機能もありますが、コレクションから必要なのがそれだけである場合にのみ使用してください。

@paper.pages.pluck(:name)
于 2013-01-29T02:00:02.610 に答える