我有一对具有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查询上手动强制连接,这会有帮助吗?
谢谢!
答案 0 :(得分:3)
您可以在调用Vehicle对象时使用includes方法来包含RoundObject 它会是这样的:
Vehicle.where(conditions_for_getting_data).includes(:round_object)