我有公司表和城市表;公司属于城市。
我的数据库架构的一部分是:
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
Part of Company
model:
class Company < ActiveRecord::Base
belongs_to :city, :inverse_of => :companies
# ....
end
Part of City
model:
class City < ActiveRecord::Base
has_many :companies, :inverse_of => :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"
So, cities
表已加入,但 Rails 无论如何都会执行额外的请求cities
.
这是为什么,以及如何避免额外的请求cities
table?
当我只有一条记录时(如上例所示),这并没有多大影响,但如果我想得到Company.joins(:city).all
,然后获取每个公司的城市,然后每次获取的额外开销cities
is very重要的。