为什么在has_one关系中使用包时运行两个查询

时间:2013-12-05 23:50:28

标签: ruby-on-rails-3.2 rails-activerecord eager-loading

class Product < ActiveRecord::Base
  attr_accessible :brand_id, :name

  belongs_to :brand
end

class Brand < ActiveRecord::Base
  attr_accessible :name

  has_many :products

end

控制器操作:

  def index
    @products = Product.includes(:brand)

    respond_to do |format|
      format.html # index.html.erb
      format.json { render json: @products }
    end
  end

观看:

<% @products.each do |product| %>
  <tr>
    <td><%= product.brand.name %></td>
    <td><%= product.name %></td>
    <td><%= link_to 'Show', product %></td>
    <td><%= link_to 'Edit', edit_product_path(product) %></td>
    <td><%= link_to 'Destroy', product, method: :delete, data: { confirm: 'Are you sure?' } %></td>
  </tr>
<% end %>

我看到两个查询运行了:

SELECT `products`.* FROM `products`  
SELECT `brands`.* FROM `brands`  WHERE `brands`.`id` IN (1, 2)

我想知道为什么ActiveRecord不只是运行以下查询?

select products.*, brands.name
from products
join brands
on brands.id = products.brand_id

我认为我必须遗漏一些东西 - 因为我非常肯定当我使用.NET的实体框架做类似的事情并使用Includes时,只会运行一个查询。

我错过了什么吗?

1 个答案:

答案 0 :(得分:1)

我认为ActiveRecord和Entity Framework之间的区别在于Entity Framework专门将模式存储在ActiveRecord需要查询数据库以获取模式的地方。

所以,如果ActiveRecord做了像

这样的查询,我可能会错
select products.*, brands.*
from products
join brands
on brands.id = products.brand_id

它不知道产品领域的结束和品牌领域的开始。