Это скорее вопрос "почему дела так", а не вопрос "Я не знаю, как это сделать"...
Таким образом, Евангелие по вытаскиванию связанных записей, которые вы знаете, вы собираетесь использовать, это использовать :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 осознает проблему производительности и не присоединяется, за исключением некоторых случаев?