Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何迭代ActiveRecord对象';s关联对象_Ruby On Rails_Activerecord - Fatal编程技术网

Ruby on rails 如何迭代ActiveRecord对象';s关联对象

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(假期.飞机) ……等等 但这是非常不雅的,特别是如果

我需要对Rails 5 ActiveRecord对象的所有关联对象执行操作,但我不想为每个对象显式编写单独的方法调用。
例如,假设“假期”是我正在处理的对象,它可能有许多关联对象(为了简单起见,假设所有对象都有一个):代理、旅行者、飞机、轮船、酒店。 我可以做到:

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.下划线)
它在我的应用程序中工作,所以我很高兴,但我认为仍然有一种更健壮的方法,对于某些类命名边缘情况不会中断。