Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.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 Rails:如何获取并迭代父模型的所有子模型?_Ruby On Rails_Ruby_Rails Activerecord - Fatal编程技术网

Ruby on rails Rails:如何获取并迭代父模型的所有子模型?

Ruby on rails Rails:如何获取并迭代父模型的所有子模型?,ruby-on-rails,ruby,rails-activerecord,Ruby On Rails,Ruby,Rails Activerecord,有没有一种方法可以轻松有效地获取父模型的相应(子)模型,然后在模板中进行渲染?我想知道如何使用和不使用连接 例如,考虑这3个表: # ProductGroup is the highest parent class ProductGroup < ActiveRecord::Base attr_accessible :name, :merchant_id has_many :product_items has_many :product_group_selections end

有没有一种方法可以轻松有效地获取父模型的相应(子)模型,然后在模板中进行渲染?我想知道如何使用和不使用连接

例如,考虑这3个表:

# ProductGroup is the highest parent
class ProductGroup < ActiveRecord::Base
  attr_accessible :name, :merchant_id
  has_many :product_items
  has_many :product_group_selections
end

# ProductItem is a child of ProductGroup
class ProductItem < ActiveRecord::Base
  attr_accessible :base_price, :name, :product_group_id
  belongs_to :product_group
end

# ProductGroupSelection is a child of ProductGroup
class ProductGroupSelection < ActiveRecord::Base
  attr_accessible :name, :price_extra, :product_attr_group_id, :product_item_id
  belongs_to :product_group
  has_many :product_group_selection_attrs
end

# ProductGroupSelectionAttr is a child of ProductGroupSelection
class ProductGroupSelectionAttr < ActiveRecord::Base
  attr_accessible :name, :product_group_id
  belongs_to :product_group_selection
end
通过这种方式,我可以依次遍历所有组及其子模型,以使用ERB生成表单


谢谢

也许是这样的:

class ProductGroup < ActiveRecord::Base

    # I have no idea what to call this method
    def merchant_data    
        {:name => self.name, :merchant_id => self.merchant_id, :items => self.product_items, :selections => self.product_group_selections}
    end

end
只需在视图中使用类似于处理任何其他实例变量的散列,只是这次使用散列。例如,如果希望循环遍历返回的数据结构中的所有项,只需执行以下操作:

@merchant_data[:items].each {|item| ... }

当对一组记录进行迭代,而这些记录又有集合时,您将遇到臭名昭著的N+1查询。基本上,对于每个ProductGroup,您都会运行一个查询以提取其所有ProductItem记录。如果你与两个级别的关系一起工作,情况会更糟

为了使这项工作更有效,您需要使用ActiveRecord定义为在尽可能少的查询中快速加载关联的方法的includes

ProductGroup.includes(:product_items).includes(:product_group_selections => :product_group_selection_attrs)
从那里,您只需添加所需的任何条件,并且为ProductGroup加载的任何内容都将确保所有关联模型也被加载

现在,您只需正常地迭代您的关联。假设@product\U groups有一个ProductGroup集合

@product_groups.each do |product_group|
  # do stuff with product_group
  product_group.product_items.each do |product_item|
    # do stuff with product_item
  end
  product_group.product_group_selections do |product_group_selection|
    # do stuff with product_group_selection
    product_group_selection.product_group_selection_attrs do |product_group_selection_attr|
      # do stuff with product_group_selection_attr
    end
  end
end
rails设置关联的默认方式应该满足您要求的数据结构,只是使用实际记录而不是散列,您无论如何都需要加载散列来创建散列

ProductGroup.includes(:product_items).includes(:product_group_selections => :product_group_selection_attrs)
@product_groups.each do |product_group|
  # do stuff with product_group
  product_group.product_items.each do |product_item|
    # do stuff with product_item
  end
  product_group.product_group_selections do |product_group_selection|
    # do stuff with product_group_selection
    product_group_selection.product_group_selection_attrs do |product_group_selection_attr|
      # do stuff with product_group_selection_attr
    end
  end
end