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