连接表时,无论如何,当从连接表访问字段时,rails会提出额外的请求
我有公司表和城市表; 公司属于city。
我的数据库架构的一部分是:
create_table "companies", force: true do |t| t.string "title", default: "", null: false t.string "address", default: "", null: false t.integer "city_id" t.datetime "created_at" t.datetime "updated_at" end create_table "cities", force: true do |t| t.string "title", default: "", null: false t.datetime "created_at" t.datetime "updated_at" t.string "test" end
Company
型号的一部分:
class Company :companies # .... end
City
模型的一部分:
class City :city # .... end
当我获取公司,然后获得其城市标题时,显然Rails会提出额外的请求以获取城市标题:
$ rails console 2.1.5 :001 > Company.first.city.title Company Load (0.2ms) SELECT "companies".* FROM "companies" ORDER BY "companies"."id" ASC LIMIT 1 City Load (0.3ms) SELECT "cities".* FROM "cities" WHERE "cities"."id" = ? LIMIT 1 [["id", 2]] => "My city 1"
而且我很确定我可以通过加入cities
表来避免这种情况。 但是我错了:
2.1.5 :002 > Company.joins(:city).first.city.title Company Load (0.3ms) SELECT "companies".* FROM "companies" INNER JOIN "cities" ON "cities"."id" = "companies"."city_id" ORDER BY "companies"."id" ASC LIMIT 1 City Load (0.1ms) SELECT "cities".* FROM "cities" WHERE "cities"."id" = ? LIMIT 1 [["id", 2]] => "My city 1"
因此, cities
表已加入,但Rails无论如何都会对cities
执行其他请求。
为什么会这样,以及如何避免对cities
表的其他请求?
当我只有一条记录时(例如上面的示例),它没有太大的损害,但如果我想获得Company.joins(:city).all
,然后获得每个公司的城市,那么每次获取的额外开销来自cities
非常重要。
尝试includes
在Company.includes(:city).first.city.title
。