ruby on rails中的动态加载优化



我有一个产品有许多变体。变体属于产品。我想显示产品的名称(可以在product中找到)以及价格和数量(可以在variables中找到)。

Product table:
 -id
 -title
 -description
Variants table:
 - id
 - is_active(boolean)
 - price
 - quantity
 - product_id

表是这样的。这是我的尝试

  def index
    @products =Product.all
    @display = []
    @products.each do |product|
      @children = product.variants.where(is_active: true).order(:price).
                                   select(:id,:price,:quantity).first
      if @children.present?
      @display << {
                   id: product.id,
                    title: product.title,
                    description: product.description,
                    price:  @children.price,
                    quantity:  @children.quantity,
                    variant_id:  @children.id
                  }
      end
    end
    @display = Kaminari.paginate_array(@display).page(params[:page])
  end

我需要将其优化到最大值。这就引出了我的第一个问题。我怎样才能更好地优化它。
我的第二个问题是,为什么当我做@products = product .all.includes(: variables)时,它实际上会增加加载时间,而不是降低加载时间,因为我确实在整个@products数组的迭代中获得每个产品的变体(因此它应该算作N+1,我得到每个产品的变体)?将@products的数组分成4个并使4个线程填充显示是一个好主意吗?

您的代码没有使用急于加载的数据,这就是为什么添加包含会减慢速度-这只是额外的工作。

一般来说,如果你调用查询方法(where, order等),rails不能使用即时加载的数据。相反,你可以创建一个新的关联:

has_many :active_variants,  -> { where(is_active: true).order(:price) }, class_name: "Variant"

然后急切加载并使用这个关联而不是变量关联。

你应该写为;

def index
  @display = Varient.joins(:product).where(is_active: true).order(:price).select('products.id as id, products.title, products.description, price, quantity, variants.id as variant_id')
end

相关内容

  • 没有找到相关文章

最新更新