Zin*_*inc 2 ruby ruby-on-rails-3
只是做一些Rails并注意到当使用@products.each do它在单个页面上显示30个产品时,好像在后台有很多查询,请参阅下面的我的控制台输出.这是对的,还是我读错了?
Category Load (0.1ms)  SELECT "categories".* FROM "categories" WHERE ("categories"."name" = 'bras') LIMIT 1
  Product Load (28.0ms)  SELECT "products".* FROM "products" WHERE ("products".category_id = 48)
  Brand Load (0.2ms)  SELECT "brands".* FROM "brands" WHERE ("brands"."id" = 408) LIMIT 1
  Category Load (0.1ms)  SELECT "categories".* FROM "categories" WHERE ("categories"."id" = 48) LIMIT 1
  Merchant Load (0.1ms)  SELECT "merchants".* FROM "merchants" WHERE ("merchants"."id" = 2) LIMIT 1
Rendered products/_product.html.erb (16.9ms)
  CACHE (0.0ms)  SELECT "brands".* FROM "brands" WHERE ("brands"."id" = 408) LIMIT 1
  CACHE (0.0ms)  SELECT "categories".* FROM "categories" WHERE ("categories"."id" = 48) LIMIT 1
  CACHE (0.0ms)  SELECT "merchants".* FROM "merchants" WHERE ("merchants"."id" = 2) LIMIT 1
Rendered products/_product.html.erb (1.8ms)
  CACHE (0.0ms)  SELECT "brands".* FROM "brands" WHERE ("brands"."id" = 408) LIMIT 1
  CACHE (0.0ms)  SELECT "categories".* FROM "categories" WHERE ("categories"."id" = 48) LIMIT 1
  CACHE (0.0ms)  SELECT "merchants".* FROM "merchants" WHERE ("merchants"."id" = 2) LIMIT 1
Rendered products/_product.html.erb (1.5ms)
  CACHE (0.0ms)  SELECT "brands".* FROM "brands" WHERE ("brands"."id" = 408) LIMIT 1
  CACHE (0.0ms)  SELECT "categories".* FROM "categories" WHERE ("categories"."id" = 48) LIMIT 1
  CACHE (0.0ms)  SELECT "merchants".* FROM "merchants" WHERE ("merchants"."id" = 2) LIMIT 1
Rendered products/_product.html.erb (1.5ms)
  CACHE (0.0ms)  SELECT "brands".* FROM "brands" WHERE ("brands"."id" = 408) LIMIT 1
  CACHE (0.0ms)  SELECT "categories".* FROM "categories" WHERE ("categories"."id" = 48) LIMIT 1
  CACHE (0.0ms)  SELECT "merchants".* FROM "merchants" WHERE ("merchants"."id" = 2) LIMIT 1
Rendered products/_product.html.erb (1.5ms)
  CACHE (0.0ms)  SELECT "brands".* FROM "brands" WHERE ("brands"."id" = 408) LIMIT 1
  CACHE (0.0ms)  SELECT "categories".* FROM "categories" WHERE ("categories"."id" = 48) LIMIT 1
  CACHE (0.0ms)  SELECT "merchants".* FROM "merchants" WHERE ("merchants"."id" = 2) LIMIT 1
Rendered products/_product.html.erb (1.5ms)
  CACHE (0.0ms)  SELECT "brands".* FROM "brands" WHERE ("brands"."id" = 408) LIMIT 1
  CACHE (0.0ms)  SELECT "categories".* FROM "categories" WHERE ("categories"."id" = 48) LIMIT 1
  CACHE (0.0ms)  SELECT "merchants".* FROM "merchants" WHERE ("merchants"."id" = 2) LIMIT 1
Rendered products/_product.html.erb (1.5ms)
  CACHE (0.0ms)  SELECT "brands".* FROM "brands" WHERE ("brands"."id" = 408) LIMIT 1
  CACHE (0.0ms)  SELECT "categories".* FROM "categories" WHERE ("categories"."id" = 48) LIMIT 1
  CACHE (0.0ms)  SELECT "merchants".* FROM "merchants" WHERE ("merchants"."id" = 2) LIMIT 1
Rendered products/_product.html.erb (1.5ms)
  CACHE (0.0ms)  SELECT "brands".* FROM "brands" WHERE ("brands"."id" = 408) LIMIT 1
  CACHE (0.0ms)  SELECT "categories".* FROM "categories" WHERE ("categories"."id" = 48) LIMIT 1
  CACHE (0.0ms)  SELECT "merchants".* FROM "merchants" WHERE ("merchants"."id" = 2) LIMIT 1
Rendered products/_product.html.erb (1.7ms)
  CACHE (0.0ms)  SELECT "brands".* FROM "brands" WHERE ("brands"."id" = 408) LIMIT 1
  CACHE (0.0ms)  SELECT "categories".* FROM "categories" WHERE ("categories"."id" = 48) LIMIT 1
  CACHE (0.0ms)  SELECT "merchants".* FROM "merchants" WHERE ("merchants"."id" = 2) LIMIT 1
Rendered products/_product.html.erb (1.4ms)
  CACHE (0.0ms)  SELECT "brands".* FROM "brands" WHERE ("brands"."id" = 408) LIMIT 1
  CACHE (0.0ms)  SELECT "categories".* FROM "categories" WHERE ("categories"."id" = 48) LIMIT 1
  CACHE (0.0ms)  SELECT "merchants".* FROM "merchants" WHERE ("merchants"."id" = 2) LIMIT 1
Rendered products/_product.html.erb (1.5ms)
  CACHE (0.0ms)  SELECT "brands".* FROM "brands" WHERE ("brands"."id" = 408) LIMIT 1
  CACHE (0.0ms)  SELECT "categories".* FROM "categories" WHERE ("categories"."id" = 48) LIMIT 1
  CACHE (0.0ms)  SELECT "merchants".* FROM "merchants" WHERE ("merchants"."id" = 2) LIMIT 1
Rendered products/_product.html.erb (1.4ms)
  CACHE (0.0ms)  SELECT "brands".* FROM "brands" WHERE ("brands"."id" = 408) LIMIT 1
  CACHE (0.0ms)  SELECT "categories".* FROM "categories" WHERE ("categories"."id" = 48) LIMIT 1
  CACHE (0.0ms)  SELECT "merchants".* FROM "merchants" WHERE ("merchants"."id" = 2) LIMIT 1
Rendered products/_product.html.erb (1.5ms)
  CACHE (0.0ms)  SELECT "brands".* FROM "brands" WHERE ("brands"."id" = 408) LIMIT 1
  CACHE (0.0ms)  SELECT "categories".* FROM "categories" WHERE ("categories"."id" = 48) LIMIT 1
  CACHE (0.0ms)  SELECT "merchants".* FROM "merchants" WHERE ("merchants"."id" = 2) LIMIT 1
Rendered products/_product.html.erb (1.5ms)
  CACHE (0.0ms)  SELECT "brands".* FROM "brands" WHERE ("brands"."id" = 408) LIMIT 1
  CACHE (0.0ms)  SELECT "categories".* FROM "categories" WHERE ("categories"."id" = 48) LIMIT 1
  CACHE (0.0ms)  SELECT "merchants".* FROM "merchants" WHERE ("merchants"."id" = 2) LIMIT 1
Rendered products/_product.html.erb (1.6ms)
  CACHE (0.0ms)  SELECT "brands".* FROM "brands" WHERE ("brands"."id" = 408) LIMIT 1
  CACHE (0.0ms)  SELECT "categories".* FROM "categories" WHERE ("categories"."id" = 48) LIMIT 1
  CACHE (0.0ms)  SELECT "merchants".* FROM "merchants" WHERE ("merchants"."id" = 2) LIMIT 1
Rendered products/_product.html.erb (1.5ms)
  CACHE (0.0ms)  SELECT "brands".* FROM "brands" WHERE ("brands"."id" = 408) LIMIT 1
  CACHE (0.0ms)  SELECT "categories".* FROM "categories" WHERE ("categories"."id" = 48) LIMIT 1
  CACHE (0.0ms)  SELECT "merchants".* FROM "merchants" WHERE ("merchants"."id" = 2) LIMIT 1
Rendered products/_product.html.erb (1.5ms)
  CACHE (0.0ms)  SELECT "brands".* FROM "brands" WHERE ("brands"."id" = 408) LIMIT 1
  CACHE (0.0ms)  SELECT "categories".* FROM "categories" WHERE ("categories"."id" = 48) LIMIT 1
  CACHE (0.0ms)  SELECT "merchants".* FROM "merchants" WHERE ("merchants"."id" = 2) LIMIT 1
Rendered products/_product.html.erb (1.5ms)
  CACHE (0.0ms)  SELECT "brands".* FROM "brands" WHERE ("brands"."id" = 408) LIMIT 1
  CACHE (0.0ms)  SELECT "categories".* FROM "categories" WHERE ("categories"."id" = 48) LIMIT 1
  CACHE (0.0ms)  SELECT "merchants".* FROM "merchants" WHERE ("merchants"."id" = 2) LIMIT 1
Rendered products/_product.html.erb (1.5ms)
  CACHE (0.0ms)  SELECT "brands".* FROM "brands" WHERE ("brands"."id" = 408) LIMIT 1
  CACHE (0.0ms)  SELECT "categories".* FROM "categories" WHERE ("categories"."id" = 48) LIMIT 1
  CACHE (0.0ms)  SELECT "merchants".* FROM "merchants" WHERE ("merchants"."id" = 2) LIMIT 1
Rendered products/_product.html.erb (1.6ms)
  CACHE (0.0ms)  SELECT "brands".* FROM "brands" WHERE ("brands"."id" = 408) LIMIT 1
  CACHE (0.0ms)  SELECT "categories".* FROM "categories" WHERE ("categories"."id" = 48) LIMIT 1
  CACHE (0.0ms)  SELECT "merchants".* FROM "merchants" WHERE ("merchants"."id" = 2) LIMIT 1
Rendered products/_product.html.erb (1.4ms)
  CACHE (0.0ms)  SELECT "brands".* FROM "brands" WHERE ("brands"."id" = 408) LIMIT 1
  CACHE (0.0ms)  SELECT "categories".* FROM "categories" WHERE ("categories"."id" = 48) LIMIT 1
  CACHE (0.0ms)  SELECT "merchants".* FROM "merchants" WHERE ("merchants"."id" = 2) LIMIT 1
Rendered products/_product.html.erb (1.5ms)
  CACHE (0.0ms)  SELECT "brands".* FROM "brands" WHERE ("brands"."id" = 408) LIMIT 1
  CACHE (0.0ms)  SELECT "categories".* FROM "categories" WHERE ("categories"."id" = 48) LIMIT 1
  CACHE (0.0ms)  SELECT "merchants".* FROM "merchants" WHERE ("merchants"."id" = 2) LIMIT 1
Rendered products/_product.html.erb (1.5ms)
  CACHE (0.0ms)  SELECT "brands".* FROM "brands" WHERE ("brands"."id" = 408) LIMIT 1
  CACHE (0.0ms)  SELECT "categories".* FROM "categories" WHERE ("categories"."id" = 48) LIMIT 1
  CACHE (0.0ms)  SELECT "merchants".* FROM "merchants" WHERE ("merchants"."id" = 2) LIMIT 1
Rendered products/_product.html.erb (2.0ms)
  CACHE (0.0ms)  SELECT "brands".* FROM "brands" WHERE ("brands"."id" = 408) LIMIT 1
  CACHE (0.0ms)  SELECT "categories".* FROM "categories" WHERE ("categories"."id" = 48) LIMIT 1
  CACHE (0.0ms)  SELECT "merchants".* FROM "merchants" WHERE ("merchants"."id" = 2) LIMIT 1
Rendered products/_product.html.erb (1.4ms)
  CACHE (0.0ms)  SELECT "brands".* FROM "brands" WHERE ("brands"."id" = 408) LIMIT 1
  CACHE (0.0ms)  SELECT "categories".* FROM "categories" WHERE ("categories"."id" = 48) LIMIT 1
  CACHE (0.0ms)  SELECT "merchants".* FROM "merchants" WHERE ("merchants"."id" = 2) LIMIT 1
Rendered products/_product.html.erb (1.5ms)
  CACHE (0.0ms)  SELECT "brands".* FROM "brands" WHERE ("brands"."id" = 408) LIMIT 1
  CACHE (0.0ms)  SELECT "categories".* FROM "categories" WHERE ("categories"."id" = 48) LIMIT 1
  CACHE (0.0ms)  SELECT "merchants".* FROM "merchants" WHERE ("merchants"."id" = 2) LIMIT 1
Rendered products/_product.html.erb (1.5ms)
  CACHE (0.0ms)  SELECT "brands".* FROM "brands" WHERE ("brands"."id" = 408) LIMIT 1
  CACHE (0.0ms)  SELECT "categories".* FROM "categories" WHERE ("categories"."id" = 48) LIMIT 1
  CACHE (0.0ms)  SELECT "merchants".* FROM "merchants" WHERE ("merchants"."id" = 2) LIMIT 1
Rendered products/_product.html.erb (1.6ms)
  CACHE (0.0ms)  SELECT "brands".* FROM "brands" WHERE ("brands"."id" = 408) LIMIT 1
  CACHE (0.0ms)  SELECT "categories".* FROM "categories" WHERE ("categories"."id" = 48) LIMIT 1
  CACHE (0.0ms)  SELECT "merchants".* FROM "merchants" WHERE ("merchants"."id" = 2) LIMIT 1
Rendered products/_product.html.erb (1.5ms)
  CACHE (0.0ms)  SELECT "brands".* FROM "brands" WHERE ("brands"."id" = 408) LIMIT 1
  CACHE (0.0ms)  SELECT "categories".* FROM "categories" WHERE ("categories"."id" = 48) LIMIT 1
  CACHE (0.0ms)  SELECT "merchants".* FROM "merchants" WHERE ("merchants"."id" = 2) LIMIT 1
更新:对不起,我是专门谈论CACHE线路,这些是否意味着每次都不运行这些查询?
CACHE (0.0ms)  SELECT "brands".* FROM "brands" WHERE ("brands"."id" = 408) LIMIT 1
CACHE (0.0ms)  SELECT "categories".* FROM "categories" WHERE ("categories"."id" = 48) LIMIT 1
CACHE (0.0ms)  SELECT "merchants".* FROM "merchants" WHERE ("merchants"."id" = 2) LIMIT 1
以下是产品部分的代码:
<h3><%= product.product_name %></h3>
<img src="<%= product.image %>" align="right" alt="<%= product.product_name %>" height="200" />
<p><%= truncate(product.product_description, :length => 300, :omission => "...") %></p>
<p><%= product.price %></p>
<p>Brand: <%= product.brand.brand_name %></p>
<p>Category: <%= product.category.category_name %></p>
<p>Merchant: <%= product.merchant.merchant_name %></p>
<p><a href="<%= product.link %>" target="_blank">More information</a></p>
<hr />
您可能希望急于加载您的产品/商家/等
@product = Product.find(conditions, :include => {:category, :brand, :merchant})
(我不知道你的关系,所以根据需要使用)
关于你的缓存问题进行编辑,没有那些查询不是针对服务器运行的,但你一定要考虑急切加载,这样你就不会进行不必要的查询了
有关详细信息,请参阅以下内容
http://rails-bestpractices.com/posts/29-fix-n-1-queries
http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html < - 请参阅Eager loading