【问题标题】:Most efficient way to collect associated records?收集相关记录的最有效方法?
【发布时间】:2016-04-20 19:58:20
【问题描述】:

对于我的表“商店”,我想显示一些带有相关记录的选项卡。有4个相关表,products、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

【问题讨论】:

    标签: ruby-on-rails ruby


    【解决方案1】:

    试试:

      when "stores"
        @products = @store.products.includes(variant_skus: {master_sku: :vendor_skus})
        @variant_skus = @products.map(&:variant_skus).uniq
        @master_skus = @variant_skus.map(&:master_sku).uniq
        @vendor_skus = @master_skus.map(&:vendor_skus).flatten.uniq
      end
    

    【讨论】:

    • 我得到未定义的方法 variant_sku' for #&lt;Product:0x007f9b398d0820&gt; on the @variant_skus line. I changed the line to: @variant_skus = @products.map(&amp;:variant_skus).uniq and then the line did not throw an error anymore. The next line is though: undefined method master_sku' 用于#<:activerecord_associations_collectionproxy:0x007f9b34722c80> 有什么想法吗?
    • @stoerebink 我的回答对你有帮助吗?如果是,请接受它作为答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-24
    • 2011-04-25
    • 1970-01-01
    相关资源
    最近更新 更多