【问题标题】:How to group the records based to 3rd table belongs to, has many如何根据第三个表对记录进行分组,有很多
【发布时间】:2016-10-10 12:57:58
【问题描述】:

我有以下代码:

测验.rb

has_many :quiz_attempts

学生.rb

has_many :quiz_attempts

quiz_attempt.rb

belongs_to :student
belongs_to :quiz

我需要做的是从具有测验ID的quiz_attempts表中获取学生的所有记录,并根据它显示测验表的记录。

意思是,如果学生参加了一项测验 A 10 次,测验 B 5 次,那么我需要在测验表中将所有这些行显示为 2。

在视图中,我将只有 2 条 quiz 表记录,它们与 quiz_attempts 表中的 A 和 B 的 15 条记录相关联。

quiz_attempts 也有 quiz_id 列和 student_id 列,quiz 表中没有学生 ID。

我正在处理的查询是:

@quizzes   = @student.quiz_attempts.includes(:quiz)

但问题是,它仍然显示 2 行,但来自 quiz_attempts 表,我无法将它们分组为测验表。

我需要完整的解决方案。

【问题讨论】:

    标签: mysql ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-4


    【解决方案1】:
    Quiz.joins(quiz_attempts: :student)
        .where.not(students: { id: nil })
        .group('quizzez.id')
    

    上面所做的基本上是以下内容:

    1. Quiz.joins(quiz_attempts: :student) - 从quizzes 表中选择所有与quiz_attemptsstudents 表有关联的行。
    2. .where.not(students: { id: nil }) 从上面只选择那些有学生参加过quiz_attempts 的测验。
    3. .group('quizzez.id') 表示我们不希望多次显示相同的测验,因为很多学生都试图通过它,但只有 uniq 记录。

    编辑

    正如 cmets 中所讨论的,要使上述查询基于 current_user 的 id,您可以实现 AR scope

    class Quiz < ActiveRecord::Base
      scope :by_student_id, lambda { |student_id|
        joins(quiz_attempts: :student).where(students: { id: student_id }).group('quizzez.id')
      }
    end
    

    要使用这个范围,你会写:

    Quiz.by_student_id(current_user.id)
    

    【讨论】:

    • 不工作,它仍然显示测验表中的 15 行。它确实显示了测验表中的记录,但它们的数量为 15。 quiz_attempts 表中应该只有 2 条记录,因为关联的 15 条记录。
    • @LearningROR 然后你必须按 quizzez.id 列分组,编辑答案
    • @LearningROR 很高兴为您提供帮助)
    • @LearningROR 我是乌克兰人 :D 只是我最近住在波兰,但无论如何欢迎你:)
    • 哈哈。 ;) 我的错,但你有才华兄弟 ;) 感谢所有帮助。
    猜你喜欢
    • 2019-02-10
    • 1970-01-01
    • 2011-03-28
    • 2021-12-05
    • 1970-01-01
    • 2019-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多