阻止rails url_helper从数据库请求大量不必要的对象

时间:2016-04-27 12:48:34

标签: ruby-on-rails ruby database activerecord

我正在使用rails创建一个大的xml输出,并且rails生成了很多url。有所谓的物品和围栏。每件商品可能有一个外壳。所以我在我的模型中使用了has_one和belongs_to关系。

我正在使用

enclosure_url(item.enclosure, format: :json)

用于生成网址。

我的期望:Rails应该根据存储在items表中的id生成url。

现在发生的是,rails正在从数据库中获取每个单独的机箱,这会降低我的系统速度。

Enclosure Load (2.6ms)  SELECT  "enclosures".* FROM "enclosures" WHERE "enclosures"."id" = ? LIMIT 1  [["id", 11107]]
Enclosure Load (3.1ms)  SELECT  "enclosures".* FROM "enclosures" WHERE "enclosures"."id" = ? LIMIT 1  [["id", 11108]]
Enclosure Load (0.7ms)  SELECT  "enclosures".* FROM "enclosures" WHERE "enclosures"."id" = ? LIMIT 1  [["id", 11109]]
Enclosure Load (1.5ms)  SELECT  "enclosures".* FROM "enclosures" WHERE "enclosures"."id" = ? LIMIT 1  [["id", 11110]]
Enclosure Load (6.8ms)  SELECT  "enclosures".* FROM "enclosures" WHERE "enclosures"."id" = ? LIMIT 1  [["id", 11111]]

是否有任何技巧阻止rails执行此操作或我是否必须自己生成我的URL?

1 个答案:

答案 0 :(得分:3)

IMO你有两个选择:

1)使用includes在一个查询中加载所有enclosures

@items = Item.where(...).includes(:enclosure)

2)将id的{​​{1}}传递给网址构建器而不是对象:

enclosure

我更喜欢第一个选项,因为它确保您链接的对象确实存在。