2016-06-21 20 views
0

調査では、多くの答えを持っている多くの質問があります。SurveysControllerで未定義方法

class Survey < ActiveRecord::Base 
    has_many :questions, :dependent => :destroy 
    accepts_nested_attributes_for :questions, :reject_if => -> (a) {a[:content].blank? }, :allow_destroy => true 
end 

class Question < ActiveRecord::Base 
    belongs_to :survey 
    has_many :answers, :dependent => :destroy 
    accepts_nested_attributes_for :answers, :reject_if => -> (a) {a[:content].blank? }, :allow_destroy => true 
end 

class Answer < ActiveRecord::Base 
    belongs_to :question 
end 

を、私はこれを実行します。

def show 
    @survey = Survey.find(params[:id]) 
    @questions = @survey.questions 
    @answers = @questions.answers 
    end 

を、私はエラーを取得:

undefined method `answers' for #<Question::ActiveRecord_Associations_CollectionProxy:0x007f7f68af6948> 

と、この行のレールが問題点として指摘しています。@answers = @questions.answers

なぜですか?

答えて

1

すべての質問からすべての回答を読み込もうとしていますが、1つの質問からすべての回答を読み込むように設計されているためです。

例えば、これは正しいでしょう:

@question_1 = @survey.questions.first # Notice the `first` 
@answers = @question_1.answers   # Gets all answers for the `first` question 

は、私は、単一のquestionを取得し、その答えを取得していますどのように参照してください?それは正しいです。このcollect方法は、基本的にそれぞれの質問と「通じeachループを実行しているん何

@questions = @survey.questions 
@answers = @questions.collect(&:answers) 

:あなたはすべての質問のためにすべての答えを取得したいならば

さて、あなたはcollectメソッドを使用して恩恵を受けるその子(answers)を配列に集めます。

-

あまり簡潔で、より効率的なアプローチとはいえ+ 1つのクエリをNを回避し、私は今それを得るincludes代わりのcollect

@answers = [] 
@questions.includes(:answers).each do |q| 
    @answers << q.answers 
end 
+0

を使用することです。ありがとうございました! –