我有一个与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行)?我的错误在哪里?
提前致谢!
答案 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 方法执行(用于显示结果)。如果您不这样做,控制台将尝试显示结果并在我们准备执行之前触发查询。它仍然有效,但看起来它是多个查询。