Rails链ActiveRecord加入

时间:2013-01-29 21:14:16

标签: 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 :: ConfigurationError:名为'assoc2'的关联不是   发现;也许你拼错了?

复杂的是,这些关联并非全部直接加入MyModel;相反,MyModel:assoc1相关联,而Assoc1:assoc2相关联,Assoc2:assoc3等相关联。

我应该做什么?

1 个答案:

答案 0 :(得分: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