Ruby on rails 如何迭代ActiveRecord对象';s关联对象
我需要对Rails 5 ActiveRecord对象的所有关联对象执行操作,但我不想为每个对象显式编写单独的方法调用。Ruby on rails 如何迭代ActiveRecord对象';s关联对象,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,我需要对Rails 5 ActiveRecord对象的所有关联对象执行操作,但我不想为每个对象显式编写单独的方法调用。 例如,假设“假期”是我正在处理的对象,它可能有许多关联对象(为了简单起见,假设所有对象都有一个):代理、旅行者、飞机、轮船、酒店。 我可以做到: do_stuff_to_assoc_object(假期代理) do_stuff__to_assoc_object(假期.旅行者) do_stuff__to_assoc_object(假期.飞机) ……等等 但这是非常不雅的,特别是如果
例如,假设“假期”是我正在处理的对象,它可能有许多关联对象(为了简单起见,假设所有对象都有一个):代理、旅行者、飞机、轮船、酒店。 我可以做到: do_stuff_to_assoc_object(假期代理) do_stuff__to_assoc_object(假期.旅行者) do_stuff__to_assoc_object(假期.飞机) ……等等 但这是非常不雅的,特别是如果有很多协会的话。 幸亏 ,我知道我可以将关联对象的模型类名作为字符串或AssociationReflection对象获取,但是如何获取它们所表示的实际对象呢
parent_object.reflect_on_all_associations(:has_one).map(&:class_name).each do |model_name|
### how to convert model_name into the object?
do_stuff_to_assoc_object(obj)
end
def do_stuff_to_assoc_object(obj)
# I do things to the associated object here
end
可以使用public\u send将模型名称转换为对象如果您获取了关联模型,请检查以下内容:
parent_object.reflect_on_all_associations(:has_one).map(&:class_name).each do |model_name|
# assuming that parent_object is the object that has all associations.
obj = parent_object.public_send(model_name)
do_stuff_to_assoc_object(obj)
end
def do_stuff_to_assoc_object(obj)
# I do things to the associated object here
end
根据@Clemens-Kofler评论,为避免重复,我们可以删除.map,如下所示:
parent_object.reflect_on_all_associations(:has_one).each do |association|
# assuming that parent_object is the object that has all associations.
obj = parent_object.public_send(association.class_name)
do_stuff_to_assoc_object(obj)
end
def do_stuff_to_assoc_object(obj)
# I do things to the associated object here
end
参考资料:关于这段代码,我唯一要改变的是避免双重迭代,只需这样做:
父对象。反思所有关联(:有一个)。每个都做关联。
然后使用父对象。public\u send(association.class\u name)
@ClemensKofler你有理由,不需要包括it@Shiko谢谢你,这是个骗局。但是,我还有更多的工作要做:第一个父对象
应该是父类
(反射适用于类,而不是实例),我必须对关联的类名进行分类:对象.public\u send(association.class\u name.下划线)
它在我的应用程序中工作,所以我很高兴,但我认为仍然有一种更健壮的方法,对于某些类命名边缘情况不会中断。