在[类型,ID]列表中具有has_many关系的Rails查询

时间:2019-11-29 09:02:56

标签: mysql ruby-on-rails ruby-on-rails-5

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

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

我的模特看起来像这样。

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*})

是否有一个解决方案可以通过一个查询执行此操作? 还是我必须用另一种方式做?

感谢您的帮助。

(红宝石:2.6.0 /滑轨: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

1 个答案:

答案 0 :(得分:1)

netbeans_default_options="-J-XX:+UseStringDeduplication -J-Djdk.lang.Process.allowAmbiguousCommands=true -J-Xss2m -J-Djdk.gtk.version=2.2 -J-Dapple.laf.useScreenMenuBar=true -J-Dapple.awt.graphics.UseQuartz=true -J-Dsun.java2d.noddraw=true -J-Dsun.java2d.uiScale=2.5 -J-Dsun.java2d.dpiaware=true -J-Dsun.zip.disableMemoryMapping=true -J-Dplugin.manager.check.updates=false -J-Dnetbeans.extbrowser.manual_chrome_plugin_install=yes -J--add-opens=java.base/java.net=ALL-UNNAMED -J--add-opens=java.base/java.lang.ref=ALL-UNNAMED -J--add-opens=java.base/java.lang=ALL-UNNAMED -J--add-opens=java.base/java.security=ALL-UNNAMED -J--add-opens=java.base/java.util=ALL-UNNAMED -J--add-opens=java.desktop/javax.swing.plaf.basic=ALL-UNNAMED -J--add-opens=java.desktop/javax.swing.text=ALL-UNNAMED -J--add-opens=java.desktop/javax.swing=ALL-UNNAMED -J--add-opens=java.desktop/java.awt=ALL-UNNAMED -J--add-opens=java.desktop/java.awt.event=ALL-UNNAMED -J--add-opens=java.prefs/java.util.prefs=ALL-UNNAMED -J--add-opens=jdk.jshell/jdk.jshell=ALL-UNNAMED -J--add-modules=jdk.jshell -J--add-exports=java.desktop/sun.awt=ALL-UNNAMED -J--add-exports=java.desktop/java.awt.peer=ALL-UNNAMED -J--add-exports=java.desktop/com.sun.beans.editors=ALL-UNNAMED -J--add-exports=java.desktop/sun.swing=ALL-UNNAMED -J--add-exports=java.desktop/sun.awt.im=ALL-UNNAMED -J--add-exports=jdk.internal.jvmstat/sun.jvmstat.monitor=ALL-UNNAMED -J--add-exports=java.management/sun.management=ALL-UNNAMED -J--add-exports=java.base/sun.reflect.annotation=ALL-UNNAMED -J--add-exports=jdk.javadoc/com.sun.tools.javadoc.main=ALL-UNNAMED -J-XX:+IgnoreUnrecognizedVMOptions" 当然,如果我正确理解了您要尝试的内容。

对于您在评论中的要求: Constraint.includes(:vars).where(active: true).where.not(vars: { model: nil })