Rails链ActiveRecord连接

Rails链ActiveRecord连接,activerecord,join,associations,Activerecord,Join,Associations,我正在使用一个关联名称数组,我想执行连接来构建ActiveRecord::Relation对象。我想做如下工作: association_names = %w(assoc1 assoc2 assoc3 ... assocN) my_relation = MyModel.where(nil) association_names.each{|name| my_relation = my_relation.joins(name.to_sym) } 但这会导致错误消息: ActiveRecord::C

我正在使用一个关联名称数组,我想执行连接来构建ActiveRecord::Relation对象。我想做如下工作:

association_names = %w(assoc1 assoc2 assoc3 ... assocN)
my_relation = MyModel.where(nil)
association_names.each{|name| my_relation = my_relation.joins(name.to_sym) }
但这会导致错误消息:

ActiveRecord::ConfigurationError:未找到名为“assoc2”的关联 建立也许你拼错了

复杂的是,这些关联并非都直接连接到
MyModel
;相反,
MyModel
:assoc1
关联,
assoc1
:assoc2
关联,
assoc2
:assoc3
关联,等等

我该怎么办?

您(我的)连接很复杂,因此它不应该只是一个数组。它应该更像:

my_relation.joins([{assoc1 => [assoc2, {assoc3 => assoc4}]}, assoc5])
如果您使用的是关联名称数组,那么实现his并不是一种方便的方法,但是您可以编写一些额外的代码来测试给定的关联是否属于当前模型

下面说明了此类任务中涉及的概念,但请注意,这是一个糟糕的示例,因为它既不彻底,也不健壮

models = [MyModel]
joins = []
while associations.present? do
  associations.each do |a|
    models.each do |m|
      assoc_model = m.reflect_on_association(a)
      # assoc_model will be non-nil if there is an association for the given model and given name
      if assoc_model
        # add the associated class to models (for continued iteration)
        models << assoc_model.class_name
        # Somehow workout where in your complex Array of +joins+ this assoc this association belongs.
        # There are too many possible implementations to pick one for my time. 
        # ...
      end
    end
  end
end
models=[MyModel]
联接=[]
你现在在吗?做
每个协会都有一个|
每种型号都有| m|
assoc_model=m.在关联上反映(a)
#如果给定模型和给定名称存在关联,则assoc_模型将为非nil
如果是assoc_模型
#将关联类添加到模型(用于继续迭代)
模型