0

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

例如,考虑这 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

我想要的是一个看起来像这样的数据结构(在 product_groups 中搜索 Mercer_id = 1 时)

merchant_id 1 => {  
          ProductGroup.name, ProductGroup.merchant_id,  
          ProductItems => [...],
          ProductGroupSelections => {ProductGroupSelections.name, ProductGroupSelectionAttrs => [...]}
}

这样,我可以依次循环遍历所有组及其子模型,以使用 ERB 生成表单。

谢谢

4

2 回答 2

2

当迭代一个又包含集合的记录集合时,您将遇到臭名昭著的 N+1 查询。基本上,对于每个 ProductGroup,您都会运行一个查询来拉回它的所有 ProductItem 记录。更糟糕的是,如果您使用 2 个级别的关系。

为了使这项工作更有效,您希望使用 ActiveRecord 定义为在尽可能少的查询中预先加载关联的方法。

ProductGroup.includes(:product_items).includes(:product_group_selections => :product_group_selection_attrs)

从那里您只需添加您需要的任何条件,并且为 ProductGroup 加载的任何内容都将确保所有关联的模型也被加载。

现在您只需正常迭代您的关联。假设 @product_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 建立关联的默认方式应该满足您要求的数据结构,只需使用实际记录而不是哈希哈希,无论如何您都需要加载它以创建哈希哈希。

于 2013-02-20T16:32:08.137 回答
0

也许是这样的:

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

在您的控制器内部,您将拥有以下内容:

def merchant_search    
  @product_group = ProductGroup.find_by_merchant_id(params[:merchant_id})
  @merchant_data = @product_group.merchant_data    
  #@merchant_data => {:name=>"...", :merchant_id=> 1, :items=>[....], :selections=>[..]}
end

只需在视图中使用散列,类似于使用任何其他实例变量的方式,只是这次使用散列。例如,如果您想简单地遍历返回的数据结构中的所有项目:

@merchant_data[:items].each {|item| ... }
于 2013-02-20T16:21:27.030 回答