从'.first'和'[i]'之间的哈希/差异中获取属性

时间:2013-08-29 09:27:50

标签: ruby-on-rails ruby ruby-on-rails-3 hash

我有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
在视图中,我正在调用第二种方法:

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

返回

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

如果我改变类方法的最后一行来调用@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的每个实例。

1 个答案:

答案 0 :(得分: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]