Active Record的“加入”方法背后是什么?

时间:2012-03-08 14:14:09

标签: ruby-on-rails activerecord join

语法之间是否存在差异

"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 :(得分:4)

在第二个日志输出中,您所看到的不是更长的查询,而是ActiveRecord检查架构,以便它可以做它所做的魔术。这种反射在开发过程中经常发生,因此可以自动获取对模式的任何更改,而无需担心重新启动进程(无论是控制台还是Web服务器)。

如果您查看以Game Load开头的行,这就是您感兴趣的查询发生的位置,它们几乎相同。