2012-03-08 16 views
4

是否有所述語法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 

在此先感謝大家,我剛剛加入社區,這是我的第一個問題

回答

4

在第二個日誌輸出中,您所看到的不是更長的查詢,而是ActiveRecord檢查模式以便它可以做它的魔力。這種反射在開發過程中非常頻繁地發生,因此對模式的任何更改都會自動獲取,而無需擔心重新啓動流程(無論是控制檯還是Web服務器)。

如果您看看以Game Load開頭的行,這就是您感興趣的查詢發生的位置,它們幾乎完全相同。

相關問題