0

我有一个模型叫Evaluation. evaluation创建 an 时,将使用eval_number它创建 an。有很多evaluations相同的eval_number

这是一个例子:

- !ruby/object:Evaluation
  attributes:
    id: 2023
    score: 3
    created_at: 2013-09-08 13:10:53.000000000 Z
    updated_at: 2013-09-08 13:10:53.000000000 Z
    student_id: 26
    goal_id: 50
    eval_number: 33
- !ruby/object:Evaluation
  attributes:
    id: 2099
    score: 4
    created_at: 2013-09-08 13:19:12.000000000 Z
    updated_at: 2013-09-08 13:19:12.000000000 Z
    student_id: 26
    goal_id: 36
    eval_number: 34
- !ruby/object:Evaluation
  attributes:
    id: 2100
    score: 3
    created_at: 2013-09-08 13:19:12.000000000 Z
    updated_at: 2013-09-08 13:19:12.000000000 Z
    student_id: 26
    goal_id: 37
    eval_number: 34
- !ruby/object:Evaluation
  attributes:
    id: 2101
    score: 4
    created_at: 2013-09-08 13:19:12.000000000 Z
    updated_at: 2013-09-08 13:19:12.000000000 Z
    student_id: 26
    goal_id: 38
    eval_number: 34

在一个视图中,我想evaluation在表头中显示给定的创建日期。它应该如下所示:

date_1  |  date_2  |  date_3  | date_4  |  etc..

要做到这一点,我需要得到不同evaluation_numbers的 +created_at日期。我认为会有所帮助,但使用此代码会返回不止一条记录eval_number

  def eval_date(i)
    evals = self.goals.first.evaluations
    eval = evals.select("distinct(eval_number), created_at").all[i]
    eval.created_at.to_date
  end

似乎eval_number正在选择distinct ,但created_at选择了不同的列(当然它们都是不同的)。这使得它.all[i]基本上无用,因为它正确地找到了元素 - 但是返回的数组中 [0], [1], [2], etc的给定数量远远超过。i

我想找到一个独特的eval_number并仅加载created_date与之相关的内容。我想我可以加载所有属性的整个记录​​,但我不需要它们,所以我宁愿不要。

4

2 回答 2

1

尝试这个:

 def eval_date(i)
    evals = self.goals.first.evaluations
    eval = evals.order("eval_number").group(:eval_number).all[i]
    eval.created_at.to_date
 end

PS:如果您eval_date重复调用,则像这样缓存评估

 def eval_date(i)
    @evals ||= self.goals.first.evaluations.order("eval_number").group("eval_number").all
    eval = @evals[i]
    eval.created_at.to_date
 end
于 2013-09-30T06:26:25.337 回答
0

让它像这样工作,但我愿意接受更好的建议:

  #student.rb  
  def eval_date(i)
    eval = self.goals.first.evals_by_number.values[i].first
    eval.created_at.strftime("%d %b, %Y")
  end

  #goal.rb
  def evals_by_number
    self.evaluations.order("eval_number").group_by(&:eval_number)    
  end
于 2013-09-29T16:38:48.630 回答