【问题标题】:Query for distinct instance of model + one other field查询模型的不同实例 + 另一个字段
【发布时间】:2013-09-29 09:23:52
【问题描述】:

我有一个名为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_numbers,但不同的created_at 列(当然都是不同的)。这使得.all[i] 基本上没用,因为它正确地找到了[0], [1], [2], etc 元素——但是返回的数组中的i 的给定数量远远超过了任何数量。

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

【问题讨论】:

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


    【解决方案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
    

    【讨论】:

    • 感谢您的回答 - eval = evals[i] 应该是 eval = @evals[i] 吗?
    【解决方案2】:

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

      #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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-19
      • 1970-01-01
      • 2013-09-12
      • 1970-01-01
      • 1970-01-01
      • 2017-11-21
      • 2011-05-21
      相关资源
      最近更新 更多