查询模型的唯一实例+另一个字段

时间:2013-09-29 09:23:53

标签: mysql ruby-on-rails ruby-on-rails-3.2 distinct

我有一个名为Evaluation的模型。创建evaluation后,会使用它创建eval_number。有许多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日期。我认为this会有所帮助,但它会使用以下代码返回每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,但不同的created_at列(当然这些都是不同的)。这使得.all[i]基本无用,因为它正确地找到了[0], [1], [2], etc元素 - 但是返回的数组中只有i的给定数量。

我想找到一个不同的eval_number并仅加载与之相关的created_date。我想我可以用所有属性加载整个记录,但我不需要它们,所以我宁愿不这样做。

2 个答案:

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

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