根据特定的关联列获取唯一记录-Rails Active Record Associations

时间:2019-03-13 09:28:32

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

我有三种型号。 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次尝试

2 个答案:

答案 0 :(得分:2)

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

您应该能够执行以下操作:

<script type="text/javascript">
    //Store
    localStorage.setItem("integer", 1);
    localStorage.setItem("float", 1.5);
    localStorage.setItem("string", "Hello");
    localStorage.setItem("array", [1, 2, 3, 4, 5]);

    //Retrieve
    console.log(localStorage.getItem("integer")==="1");
    console.log(localStorage.getItem("float")==="1.5");
    console.log(localStorage.getItem("string")==="Hello");
    console.log(localStorage.getItem("array")==="1,2,3,4,5");
</script>

应生成以下SQL:

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

答案 1 :(得分:1)

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

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