我有一個模型產品,它屬於一個類別(產品表中的category_id)。我想編寫一個查詢,其中包含類別名稱的前20個產品。我有2種方式獲取它的:哪一個是首選的::包括或:連接?
使用
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有我們可以使用類別模型上編寫的模型級方法,代碼爲m礦石可維護。但它的缺點是它使用單獨的查詢來查找使用IN子句的類別。
哪個是首選方式?
還有方法3:Product.eager_load(:categories) – 2012-04-08 07:49:49
@FrederickCheung ..我無法找到該方法的任何文檔。它有什麼作用? – rubyprince 2012-04-09 12:25:15
與包含相同的效果(您可以獲得完整的類別實例),但可以使用基於聯接的查詢。 – 2012-04-09 13:20:27