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