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时,只会运行一个查询。
我错过了什么吗?
答案 0 :(得分:1)
我认为ActiveRecord和Entity Framework之间的区别在于Entity Framework专门将模式存储在ActiveRecord需要查询数据库以获取模式的地方。
所以,如果ActiveRecord做了像
这样的查询,我可能会错select products.*, brands.*
from products
join brands
on brands.id = products.brand_id
它不知道产品领域的结束和品牌领域的开始。