0

次のクラスメソッドがありますgoal

  def evals
    self.evaluations.order("eval_number").group_by(&:student_id)
  end

  def evals_for(student, i)
    @evals = []
    self.evals.values.each do |eval|
      @evals << eval.keep_if { |e| e.student_id == student.id }
    end
    @evals = @evals.reject { |array| array.empty? }.first
    @evals[i]  
  end

ビューでは、次のように 2 番目のメソッドを呼び出しています。

<% @student.student_group.eval_count.times do |i|  %>                                                 
  <td><%= goal.evals_for(@student, i) %></td> 
<% end %>

返す

#<Evaluation:x>, #<Evaluation:y>, #<Evaluation:z>

クラス メソッドの最後の行を call@evals[i].inspectに変更すると、次のように各ハッシュ内のデータを確認できます。

#<Evaluation id: 1949, score: 3, created_at: "2013-08-28 09:44:32", updated_at: "2013-08-28 09:44:32", student_id: 32, goal_id: 63, eval_number: 29>

スコアを取得したいのですが@evals[i].score、クラスメソッドの最後の行で呼び出すと、エラーが発生します -undefined method 'score' for nil:NilClass

ハッシュでクラスメソッドを呼び出せないことはわかっていますが、そのデータだけを引き出す方法はありますか? サブ質問として、私は と の違いについて少し混乱してい.firstます。[i]呼び出すと@evals.first.score「3」が返さevaluationれます。

4

1 に答える 1

0

これは単純なハッシュではありません:

#<Evaluation id: 1949, score: 3, created_at: "2013-08-28 09:44:32", updated_at: "2013-08-28 09:44:32", student_id: 32, goal_id: 63, eval_number: 29>

これはクラスのインスタンスEvaluationなので、それを呼び出すことができるはずですscore。あなたの問題は、あなたが電話をかけようとしているという事実によるものだと思いscoreますnil

メソッドを呼び出す前に、インスタンス オブジェクトがあることを確認する必要があります。

@evals[i].score if @evals[i]
于 2013-08-29T10:11:58.473 に答える