gpt4 book ai didi

mysql - Rails 查询 [types, ids] 列表中具有 has_many 关系

转载 作者:行者123 更新时间:2023-11-29 09:29:00 28 4
gpt4 key购买 nike

我有带有变量的模型(许多模型类:多态关系)以及变量之间的约束(变量不一定在同一模型中)。

我尝试进行查询以查找与模型列表关联的所有约束(以及与列表中的模型关联的所有变量),但我真的不知道该怎么做。

我的模型看起来像这样。

class Model1 < ApplicationRecord
has_many :vars, as: :model
end
class Model2 < ApplicationRecord
has_many :vars, as: :model
end

class Var < ApplicationRecord
belongs_to :model, polymorphic: true
# model_type and model_id in vars table
has_many :cns_vars
has_many :constraints, through: :cns_vars
end

class_CnsVar < ApplicationRecord
belongs_to :var
belongs_to :constraint
end

class Constraint < ApplicationRecord
has_many :cns_vars
has_many :vars, through: :cns_vars
end

为了查找与一个模型相关的约束,我有以下查询:

Constraint.includes(:vars).where(active: true, vars: {model_id: model.id, model_type: model.class.to_s})

此查询为我提供了至少有一个与我的模型关联的变量的约束。我需要与模型列表关联的所有变量的约束。

有没有办法进行相同的查询,但所有变量都与模型关联?有没有办法进行相同的查询,但所有变量都与模型列表相关联?

Constraint.includes(:vars).where(active: true, vars: {*[var.model_type, var.model_id] in my models list*})

有没有一种解决方案可以通过一个查询来完成此操作?或者我必须采取其他方式吗?

感谢您的帮助。

( ruby :2.6.0/Rails:5.2.3)

编辑:为了给出更好的解释,看看这个返回我需要的函数,但这会产生太多查询!

def constraints_for_models_list(models)
all_vars = models.flat_map(&:vars)

all_constraints = all_vars.flat_map(&:constraints)
all_constraints.uniq!

constraints = []
all_constraints.each do |constraint|
next unless constraint.vars.included_in?(all_vars)

constraints << constraint
end

return constraints
end

最佳答案

Constraint.includes(:vars).where(active: true).where.not(vars: { model: nil })当然,如果我正确地理解了你正在尝试的要点。

对于您在评论中提出的问题: Constraint.includes(:vars).where(active: true).where('vars.model_type IN
?', ['Model1',Model2'])

关于mysql - Rails 查询 [types, ids] 列表中具有 has_many 关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59101710/

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