【问题标题】:Speed up a query in Rails加快 Rails 中的查询
【发布时间】:2015-12-27 08:39:48
【问题描述】:

我正在开发一个 Rails 应用程序,它可以为将呈现在页面上的单个查询包含 20-30k 条记录。感谢您对此查询的一些反馈!

控制器

def index
  if params[:advertiser].blank?
    @products = Product.all
  else
    @advertiser_name = Advertiser.find_by(name: params[:advertiser]).name
    @products = Product.where(advertiser: @advertiser_name)
  end
end

Product 对象包含所有记录,可以通过广告商名称查找。

观点

<div class="product-listing">
  <ul>
  <% @products.each do |p| %>
    <li id="name">Product Name: <%= p.product_name %></li>
    <li id="advertiser">Advertiser: <%= p.advertiser %></li>
    <li id="designer">Designer: <%= p.designer %></li>
    <li id="price">Price: <%= p.price %></li>
    <li id="commission">Commission: <%= p.commission %></li>
    <li id="url">Url: <%= p.product_url %></li>
    <hr>
    <% end %>
  </ul>
</div>

当前加载时间

Completed 200 OK in 35531ms (Views: 31808.9ms | ActiveRecord: 3689.6ms)

向你们展示我的架构可能会有所帮助。

ActiveRecord::Schema.define(version: 20151227085753) do

create_table "advertisers", force: :cascade do |t|
  t.string   "name"
  t.datetime "created_at", null: false
  t.datetime "updated_at", null: false
end

create_table "products", force: :cascade do |t|
  t.string   "product_id"
  t.string   "product_name"
  t.string   "product_url"
  t.string   "advertiser"
  t.string   "designer"
  t.string   "price"
  t.string   "commission"
  t.datetime "created_at",   null: false
  t.datetime "updated_at",   null: false
 end

 add_index "products", ["advertiser"], name: "index_products_on_advertiser"

结束

【问题讨论】:

  • 我显然想大大加快速度。

标签: ruby-on-rails postgresql activerecord searchkick


【解决方案1】:
@products_with_details = Product.joins('inner join advertisers on product.advertiser_id = advertisers.id')
  .joins('inner join designers on product.designer_id = designers.id')
  .select('
    product.name as product_name,
    designers.name as designer_name,
    advertisers.name as advertiser_name
  ').all

将准备带有product_name、designer_name、advertisingr_name作为属性的产品对象,您可以在视图中使用它们

广告商:

这不会针对每个产品记录发出查询,以显示位于其他表格(如广告商、设计师等)上的信息。

【讨论】:

  • 或者只是Product.includes(:designer, :adverister),它也会预加载所有关联,而不是为每个关联发出单独的请求。
  • 我没有设计师表 我已经编辑了我的问题以反映我的架构现状
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-17
  • 2015-10-16
  • 1970-01-01
  • 1970-01-01
  • 2013-03-29
  • 2018-11-07
相关资源
最近更新 更多