收集相关记录的最有效方法?

时间:2016-04-20 08:05:25

标签: ruby-on-rails ruby

我的桌子"商店"我想显示一些带有相关记录的标签。有4个相关的表,产品,variant_skus,master_skus和vendor_skus。关系如下:

store has_many :products
product has_many :variant_skus
variant_sku belongs_to :master_sku
master_sku has_many :variant_skus, :vendor_skus
vendor_sku belongs_to :master_sku

现在我已经创建了一个问题,我可以将其包含在一个控制器中,为我收集这些表中的记录,但每当我打开一个商店页面时,加载需要很长时间,可能是因为所有的迭代。迭代通过关联来收集记录的速度要快于获取ID和查询数据库吗?或者是否有其他更有效的方法来收集记录?

when "stores"
  @store.products.each do |product|
    @products.push(product)
  end

  @products.each do |product|
    product.variant_skus.each do |variant_sku|
      @variant_skus.push(variant_sku)
      @master_skus.push(variant_sku.master_sku)
    end
  end
  @variant_skus = @variant_skus.uniq
  @master_skus = @master_skus.uniq

  @master_skus.each do |master_sku|
    @vendor_skus.push(master_sku.vendor_skus)
  end
  @vendor_skus = @vendor_skus.uniq
end

更新:它的工作方式如下:

@products = @store.products.includes(variant_skus: {master_sku: :vendor_skus})
@variant_skus = @products.map(&:variant_skus).flatten.uniq
@master_skus = @variant_skus.each.map(&:master_sku).uniq
@vendor_skus = @master_skus.map(&:vendor_skus).flatten.uniq

1 个答案:

答案 0 :(得分:1)

尝试:

public function scopeUser($query, $user_id)
{
    return $query->where('user_id', $user_id)
                ->select(['_id', 'company_name', 'location', 'template_id', 'current_theme_id as theme_id', 'site_url', 'site_path', 'addons']);
}
相关问题