我正在使用一个关联名称数组,我想执行连接来构建一个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
等相关联。
我应该做什么?
答案 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