2

我正在使用一个关联名称数组,并且我想执行连接来构建一个 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等相关联。

我应该做些什么?

4

1 回答 1

1

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

my_relation.joins([{assoc1 => [assoc2, {assoc3 => assoc4}]}, assoc5])

如果您使用关联名称数组进行操作,那么实际上并没有一种方便的方法来实现他,但是您可以编写一些额外的代码来测试给定的关联是否属于当前模型。

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

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
于 2014-01-13T16:17:41.630 回答