环境: ruby2.2 rails5 database:pg
1.当查询不使用where的时候
a.preload和includes查询方式一样都会生成两条sql语句
b.eager_load和joins都是一条sql语句,但eager_load为left outer join连接方式,joins则是inner joins连接方式。
2.当使用where的时候(注意:查询条件为被关联数据表,例:主表users,被关联表posts)
a。where条件三种写法
a1.使用hash,where("posts.title"=>"nihao")
a2.使用替换查询,where("posts.title = ?","title")
a3.直接表达,where("posts.title='nihao'")
b.includes
b1.使用a1写法的时候只会生成一条sql,所以可以使用
b2,使用a2,a3的写法时,因第一条sql在查询主表的时候会使用where的条件,
SELECT "users".* FROM "users" WHERE (posts.title= 'nihao').所以会报错ERROR: missing FROM-clause entry for table "posts"
但是可以使用references(:posts),生成一条sql。通过references对字符串形式的查询显式声明其引用的表是哪一个
c.preload. 在使用a1,a2,a3三种写法的时候都会发生b2的情形,且使用references还是一样
d.eager_load 可以使用a1,a2,a3,都会生成一条sql,连接方式left outer join
e.joins 可以使用a1,a2,a3,都会生成一条sql,连接方式inner join