モデル製品があり、それはカテゴリ (製品テーブルの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 には、Category モデルで記述されたモデル レベルのメソッドを使用できるという利点があり、コードはより保守しやすくなります。ただし、IN 句を使用するカテゴリを見つけるために別のクエリを使用するという欠点があります。
好ましい方法はどれですか?