如何编写Rails SQL查询以查找所有子对象都具有相等值的对象

如何编写Rails SQL查询以查找所有子对象都具有相等值的对象,sql,ruby-on-rails,postgresql,activerecord,relational-algebra,Sql,Ruby On Rails,Postgresql,Activerecord,Relational Algebra,我一直在读这篇文章,但无法将其写入Rails范围: 我有一个课程、部分和测验,目标: class Course < ActiveRecord::Base has_many :course_members has_many :members, through: :course_members has_many :sections has_many :quizzes, through: :sections end class Quiz < ActiveRecord::B

我一直在读这篇文章,但无法将其写入Rails范围:

我有一个课程、部分和测验,目标:

class Course < ActiveRecord::Base
  has_many :course_members
  has_many :members, through: :course_members
  has_many :sections
  has_many :quizzes, through: :sections
end

class Quiz < ActiveRecord::Base
  belongs_to :member
  belongs_to :section
end

class Section < ActiveRecord::Base
  belongs_to :course
  has_many :quizzes
end

哈哈!但除非太复杂。我一直试图在课程中简单地写下这一点也没问题。

这看起来正是正确的答案。非常感谢你。我得到了一个最奇怪的错误:D,[2017-10-24T13:41:08.364579 5326]调试-:成员加载1.6ms选择成员。*从成员按成员排序。id ASC LIMIT 1 nomethoder错误:未定义的方法名称'for nil:NilClass。。但是没有任何东西有名称属性..没有问题!:不知道为什么:会员协会被调用。你在什么地方有默认的范围吗?你能试试这个吗?have_many:completed_courses,->{unscoped.joins:quizzes.where.notquizzes:{completed:[false,nil]}},class_name:'courses'我通过成员类调用它。你想把这个电话放在哪里?是的,我假设你在会员课上打这个电话。就像,会员。第一。完成了大学课程。但是我刚才说的:成员是课程有很多:成员,以防万一你的课程类有一个默认的范围。它起作用了吗?如果没有,你能提供完整的stacktrace吗?啊,它有一个默认范围。。哈那个老虫子,为什么是关系代数?
class Member < ActiveRecord::Base
  has_many :courses, through: :course_members
  has_many :course_members

  has_many :completed_courses,
    -> { joins(:quizzes).where.not(quizzes: {completed: [false, nil]}) },
    through: :course_members,
    source: :course
end
class Member < ActiveRecord::Base
  has_many :courses, through: :course_members
  has_many :course_members

  has_many :completed_courses,
    -> { joins(:quizzes).where.not(quizzes: {completed: [false, nil]}) },
    through: :course_members,
    source: :course
end
irb(main):002:0> Member.first.completed_courses
  Member Load (0.2ms)  SELECT "members".* FROM "members" ORDER BY "members"."id" ASC LIMIT 1
  Course Load (0.1ms)  SELECT "courses".* FROM "courses" INNER JOIN "sections" ON "sections"."course_id" = "courses"."id" INNER JOIN "quizzes" ON "quizzes"."section_id" = "sections"."id" INNER JOIN "course_members" ON "courses"."id" = "course_members"."course_id" WHERE (NOT (("quizzes"."completed" = 'f' OR "quizzes"."completed" IS NULL))) AND "course_members"."member_id" = ?  [["member_id", 1]]