在has_and_belongs_to_many关联中显示正确数量的项目时出现问题

时间:2018-03-18 07:42:08

标签: ruby-on-rails

我有一个与UseCases相关联的模型EducationalObjectives(约6.000行)和has_and_belongs_to_many(约4.000行)(EducationalObjectivesUseCases约有8.000行)。一些EducationalObjectives属于subjectA(EducationalObjectivesUseCases中约4.500行),有些属于subjectB(EducationalObjectivesUseCases中约3.500行)。

现在我想显示所有UseCase的列表,这些UseCase与subjectA的EducationalObjectives相关联,应该是大约3.500行,但我得到大约4.500行(你猜对了:{{1}内的关联数量因为重复的条目(在subjectA上有许多EducationalObjectives的UseCases)显示条目的次数。

我的想法是,我只能告诉HABTM协会我需要针对subjectA的UseCases,但不知道如何避免重复的条目。

EducationalObjectivesUseCases

如何让Rails只显示一次使用过的UseCases(只有3.500行)?我的错误在哪里?

提前致谢!

1 个答案:

答案 0 :(得分:2)

解决此问题的最快方法是在 -chain上调用 #distinct 。由于 select 自动设置为use_cases.*,因此可以使用并过滤掉重复的记录。

def index
  @use_cases = UseCase.joins(:educational_objectives)
                      .where(educational_objectives: {subject_id: 2})
                      .order(:use_case)
                      .distinct
end

或者,这可以使用子查询来解决。

def index
  educational_objectives = EducationalObjective.where(subject_id: 2)

  use_case_ids = EducationalObjectivesUseCase
                   .where(educational_objective_id: educational_objectives)
                   .select(:use_case_id)

  @use_cases = UseCase.where(id: use_case_ids).order(:use_case)
end

修改

子查询代码将执行1个SQL查询,就像不同版本的代码一样。在控制台后缀上执行后缀为;nil的每个语句,以防止通过 #inspect 方法执行(用于显示结果)。如果您不这样做,控制台将尝试显示结果并在我们准备执行之前触发查询。它仍然有效,但看起来它是多个查询。