数据库
首页 > 数据库> > mysql-ActiveRecord自定义has_many关联对数据库进行了多次调用

mysql-ActiveRecord自定义has_many关联对数据库进行了多次调用

作者:互联网

我有一对ActiveRecord对象,这些对象具有一个belongs_to … has_many关联,并且has_many关联是定制的.例:

第一个AR对象:

class Car < Vehicle
    has_many :wheels, class_name: "RoundObject", foreign_key: :vehicle_id, conditions: "working = 1"

    validates_presence_of :wheels
    ...
end

第二个AR对象:

class RoundObject < ActiveRecord::Base
    belongs_to :vehicle
    ...
end

请注意,以上内容并不表示我的应用程序的功能,只是概述了我的两个AR对象之间的关联.

我遇到的问题是,当我重置缓存(并因此我的Rails应用重新缓存数据库中的所有AR对象)时,到了重新缓存RoundObject对象的时候,它会多次调用数据库中,每个与RoundObjects集合相关联的唯一的vehicle_id.正在运行的SQL命令将输出到控制台,因此这是我的输出:

  RoundObject Load (2.0ms)  SELECT `round_objects`.* FROM `round_objects` WHERE `round_objects`.`vehicle_id` = 28 AND (active = 1)
  RoundObject Load (1.0ms)  SELECT `round_objects`.* FROM `round_objects` WHERE `round_objects`.`vehicle_id` = 29 AND (active = 1)
  RoundObject Load (2.0ms)  SELECT `round_objects`.* FROM `round_objects` WHERE `round_objects`.`vehicle_id` = 30 AND (active = 1)

我的应用程序还有其他几个AR对象,它们使用内置的has_many关联而没有任何修改,并且我注意到它们在重置缓存时仅一次访问数据库.例如:

Micropost Load (15.0ms)  SELECT `microposts`.* FROM `microposts` INNER JOIN `posts` ON `posts`.`id` = `microposts`.`post_id` WHERE `microposts`.`active` = 1 AND `posts`.`active` = 1

我的问题是,如何使我的AR对象在缓存重置后仅命中数据库一次,同时仍保持所需的自定义has_many关联?我可以手动在被调用的SQL查询上强制加入一个连接,这会有所帮助吗?

谢谢!

解决方法:

您可以在调用Vehicle对象包含RoundObject时使用include方法.
它会像这样:

Vehicle.where(conditions_for_getting_data).includes(:round_object)

标签:activerecord,ruby,ruby-on-rails,mysql
来源: https://codeday.me/bug/20191121/2054604.html