Це скоріше питання "чому все працює таким чином", а не питання "я не знаю, як це зробити" ...
Тож євангелію про витягнення пов’язаних записів, які ви знаєте, що збираєтесь використовувати, це використовувати, :include
тому що ви отримаєте приєднання та уникнете цілого ряду зайвих запитів:
Post.all(:include => :comments)
Однак, дивлячись на журнали, жодного приєднання не відбувається:
Post Load (3.7ms) SELECT * FROM "posts"
Comment Load (0.2ms) SELECT "comments.*" FROM "comments"
WHERE ("comments".post_id IN (1,2,3,4))
ORDER BY created_at asc)
Він бере ярлик, оскільки він одразу отримує всі коментарі, але це все ще не є об'єднанням (про що, як видається, йдеться у всій документації). Єдиний спосіб я можу отримати приєднання - це використовувати :joins
замість :include
:
Post.all(:joins => :comments)
І журнали показують:
Post Load (6.0ms) SELECT "posts".* FROM "posts"
INNER JOIN "comments" ON "posts".id = "comments".post_id
Я щось пропускаю? У мене є додаток з півдесятка асоціацій, і на одному екрані я показую дані з усіх них. Здається, було б краще мати один запит, що приєднався, замість 6 осіб. Я знаю, що на користь продуктивності не завжди краще робити приєднання, а не окремі запити (адже якщо ви збираєтесь витрачений час, то схоже, що два окремі запити вище швидше, ніж з'єднання), але зрештою, документи Я читав, я здивований, бачу, що :include
не працює так, як рекламується.
Може бути , Rails є усвідомлюють проблеми продуктивності і не приєднується , за винятком деяких випадків?
includes
(для тих, хто це читає)