gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 12:35:46 26 4
gpt4 key购买 nike

我有一个模型 UseCases(大约 6.000 行)和 EducationalObjectives(大约 4.000 行)与 has_and_belongs_to_many(EducationalObjectivesUseCases 大约有 8.000 行)。一些 EducationalObjectives 属于 subjectA(EducationalObjectivesUseCases 中约 4500 行),一些属于 subjectB(EducationalObjectivesUseCases 中约 3500 行)。

现在我想显示与 subjectA 的 EducationalObjectives 相关联的所有用例的列表,它应该是大约 3500 行,但我得到大约 4500 行(你猜对了:EducationalObjectivesUseCases 中的关联数) 因为重复的条目(在 subjectA 上有很多 EducationalObjectives 的用例)显示了条目的次数。

我的想法是,我只能通过 HABTM 协会得知我需要主题 A 的用例,但不知道如何避免重复条目。

class UseCase < ApplicationRecord
has_and_belongs_to_many :educational_objectives
end

class EducationalObjective < ApplicationRecord
has_and_belongs_to_many :use_cases
end

class EducationalObjectivesUseCase < ApplicationRecord
belongs_to :educational_objective
belongs_to :use_case
end


class UseCasesController < ApplicationController
def index
@use_cases = UseCase.all.
order(:use_case).
joins(:educational_objectives).
where('educational_objectives.subject_id = ?',2)
end
end

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

提前致谢!

最佳答案

解决这个问题最快的方法是在where链上调用#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 方法(用于显示结果)执行。如果您不这样做,控制台将尝试显示结果并在我们准备好执行之前触发查询。它仍然有效,但看起来像是多个查询。

关于ruby-on-rails - 在 has_and_belongs_to_many 关联中显示正确数量的项目时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49345591/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com