Rails中的includes,preload,eager_load和joins

环境: 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

你可能感兴趣的:(Rails中的includes,preload,eager_load和joins)