我的桌子"商店"我想显示一些带有相关记录的标签。有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
答案 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']);
}