我有一个模型产品,它属于一个类别(产品表中的类别 ID)。我想编写一个查询,其中包含前 20 个产品及其类别名称。我有两种获取方式:
使用
includes
,像这样:Product.includes(:category). order(:updated_at). limit(20)
并在视图中获取类别名称,如下所示:
<%= product.category.name if product.category %>
这将创建如下查询:
SELECT `products`.* from `products` ORDER BY `products`.updated_at LIMIT 20 SELECT `categories`.* from `categories` WHERE `categories`.id IN (1,2,3,4,5..,25)
像这样使用
joins
:Product.joins("LEFT JOIN categories ON categories.id = products.category_id"). select("products.*, categories.name as category_name"). order(:updated_at). limit(20)
并在这样的视图中使用它:
<%= product.category_name %>
这将生成如下查询:
SELECT products.*, categories.name as category_name from `products` LEFT JOIN categories ON categories.id = products.category_id ORDER BY `products`.updated_at LIMIT 20
方法 1 的优点是我们可以使用在 Category 模型上编写的模型级方法,并且代码更易于维护。但它的缺点是它使用单独的查询来查找使用 IN 子句的类别。
哪个是首选方式?