【问题标题】:getting unique records on the basis of specific associated column - rails active record associations根据特定关联列获取唯一记录 - rails 活动记录关联
【发布时间】:2019-03-13 09:28:31
【问题描述】:

我有三个模型。 UserQuestionAttempt

每个User has_many :attempts

同样,Question has_many :attempts

Attempt belongs_to UserQuestion

必填:

我想要的是一种方法来返回用户对用户有关联尝试的每个问题的最后一次尝试。

我的意思是,如果用户尝试了 q1、q2 并且每个问题有 3 次尝试,那么我的方法应该返回 q1 的最后一次尝试和 q2 的最后一次尝试。

现在: 我在User 模型中创建了一个方法。

  def last_attempts
    return self.attempts.joins(:question).order("questions.id ASC ,attempts.updated_at DESC").select("DISTINCT ON (question_id) *")
  end

错误: 此方法返回重复的尝试。 (对该用户的每个问题的所有尝试)。 q1 的所有 3 次尝试和 q2 的所有 3 次尝试

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-4 activerecord associations unique


    【解决方案1】:

    您的查询中似乎有一个不必要的联接。

    您应该能够做到以下几点:

    def questions_last_attempts
      attempts
        .select("DISTINCT ON (question_id) *")
        .order(:question_id, created_at: :desc)
    end
    

    应该生成以下 SQL:

    SELECT DISTINCT ON (question_id) * FROM "attempts" WHERE "attempts"."user_id" = 1 ORDER BY "attempts"."question_id" ASC, "attempts"."created_at" DESC
    

    【讨论】:

      【解决方案2】:

      一种方法是通过AttemptUserQuestion 之间添加关系。
      然后映射user.questions ids 以选择每次第一次排序的尝试:

      class User < ApplicationRecord
        has_many :attempts
        has_many :questions, through: :attempts
      
        def last_attempts
          questions.order(:id).distinct.map do |question|
            attempts.where(question_id: question.id).order(updated_at: :desc).first
          end
        end
      end
      

      【讨论】:

      • 这个答案也是正确的。谢谢:)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多