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

时间:2014-04-25 20:58:53

标签: mysql ruby-on-rails ruby activerecord

我有一对具有belongs_to ... has_many关联的ActiveRecord对象,其中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对象需要重新启动缓存时,它会对数据库进行多次调用,每次调用与vehicle_id的集合相关联的每个唯一RoundObject。正在运行的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查询上手动强制连接,这会有帮助吗?

谢谢!

1 个答案:

答案 0 :(得分:3)

您可以在调用Vehicle对象时使用includes方法来包含RoundObject 它会是这样的:

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