ruby-on-rails - 优化 Rails 中的急切加载

标签 ruby-on-rails activerecord eager-loading

rails 3.2。我有以下内容:

# city.rb
class City < ActiveRecord::Base
  has_many :zones, :dependent => :destroy
end

# zone.rb
class Zone < ActiveRecord::Base
  belongs_to :city
  has_many :zone_shops, :dependent => :destroy
  has_many :shops, :through => :zone_shops
end

# zone_shop.rb
class ZoneShop < ActiveRecord::Base
  belongs_to :zone
  belongs_to :shop
end

# shop.rb
class Shop < ActiveRecord::Base
end

# cities_controller.rb
def show
  @trip = City.find(params[:id], :include => [:user, :zones => [:shops]])
  @zones = @trip.zones.order("position")

  # List out all shops for the trip
  shops_list_array = []
  @zones.each do |zone, i|
    zone.shops.each do |shop|
      shops_list_array << shop.name
    end
  end
  @shops_list = shops_list_array.join(', ')
end

# development.log
  City Load (0.3ms)  SELECT `cities`.* FROM `cities` WHERE `cities`.`id` = 1 LIMIT 1
  Zone Load (0.3ms)  SELECT `zones`.* FROM `zones` WHERE `zones`.`trip_id` IN (1) ORDER BY position asc
  ZoneShop Load (0.3ms)  SELECT `zone_shops`.* FROM `zone_shops` WHERE `zone_shops`.`zone_id` IN (26, 23, 22) ORDER BY position asc
  Shop Load (0.5ms)  SELECT `shops`.* FROM `shops` WHERE `shops`.`id` IN (8, 7, 1, 9)
  Zone Load (0.5ms)  SELECT `zones`.* FROM `zones` WHERE `zones`.`trip_id` = 1 ORDER BY position asc, position
  Shop Load (0.5ms)  SELECT `shops`.* FROM `shops` INNER JOIN `zone_shops` ON `shops`.`id` = `zone_shops`.`spot_id` WHERE `zone_shops`.`zone_id` = 26
  Shop Load (0.6ms)  SELECT `shops`.* FROM `shops` INNER JOIN `zone_shops` ON `shops`.`id` = `zone_shops`.`spot_id` WHERE `zone_shops`.`zone_id` = 23
  Shop Load (0.4ms)  SELECT `shops`.* FROM `shops` INNER JOIN `zone_shops` ON `shops`.`id` = `zone_shops`.`spot_id` WHERE `zone_shops`.`zone_id` = 22

请注意,在我的日志中,ID 为 26、23、22 的商店的最后 3 行是多余的。我应该如何重写我的 cities_controller.rb 以减少对系统的查询?

非常感谢。

最佳答案

@zones = @trip.zones.includes(:shops).order("position")

这会立即加载商店关联,并应消除由 zone.shops.each 引起的 n+1 查询问题

有关更多信息,请查看Ruby on Rails Guide section 12 on Eager Loading associations ,也由 @Benjamin M 链接

关于ruby-on-rails - 优化 Rails 中的急切加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15115931/

相关文章:

python - SQLAlchemy 急切加载递归模型

ruby-on-rails - 在一笔事务中分配或创建关联模型

javascript - 渲染:partial generates only one time on escape_javascript

ruby-on-rails - 在 Resque 任务之前或内部进行迭代?

ruby-on-rails - 获取回调 ActiveRecord Rails 的当前名称

ruby - 如何使用 ActiveRecord 将数组插入到 Postgresql 表中?

sql - Rails4 : How to add Computed columns in Active record

ruby-on-rails - Bundler 正在弃用 bundle 控制台以支持 bin/console。谁能更清楚地说明 bin/console 应该如何工作?

node.js - 在 Sequelize 中的嵌套急切加载中排序不起作用

java - Hibernate:如何根据特定条件从另一个实体获取或加载惰性实体?