连接表时,无论如何,当从连接表访问字段时,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 非常重要。

尝试includesCompany.includes(:city).first.city.title