Что стоит за методом «соединения» Active Record?
Есть ли разница между синтаксисами
"Game.joins(:round).where('rounds.league_id = 1')"
и
"Game.joins(:round).where(:rounds => {:league_id => 1})"
Первый производит запрос:
Game Load (7.5ms)
SELECT "games".*
FROM "games" INNER JOIN "rounds" ON "rounds"."id" = "games"."round_id"
WHERE (rounds.league_id = 1)
тогда как второй производит более длинный:
SQL (1.7ms)
SELECT a.attname, format_type(a.atttypid, a.atttypmod), d.adsrc, a.attnotnull
FROM pg_attribute a LEFT JOIN pg_attrdef d
ON a.attrelid = d.adrelid AND a.attnum = d.adnum
WHERE a.attrelid = '"rounds"'::regclass
AND a.attnum > 0 AND NOT a.attisdropped
ORDER BY a.attnum
Game Load (8.8ms)
SELECT "games".*
FROM "games"
INNER JOIN "rounds" ON "rounds"."id" = "games"."round_id"
WHERE "rounds"."league_id" = 1
Спасибо всем заранее, я только что присоединился к сообществу, и это мой первый вопрос
1 ответ
0
Во втором выводе журнала вы видите не более длинный запрос, а ActiveRecord, проверяющий схему, чтобы он мог творить чудеса, которые он выполняет. Это отражение очень часто происходит в процессе разработки, поэтому любые изменения в схеме автоматически фиксируются, не беспокоясь о перезапуске процессов (будь то консоль или веб-сервер).
Если вы посмотрите на строки, начинающиеся с Game Load
, то здесь происходит запрос, который вас интересует, и он почти идентичны.
ответил Derek Harmel 8 MarpmThu, 08 Mar 2012 19:00:51 +04002012-03-08T19:00:51+04:0007 2012, 19:00:51