gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 08:17:02 25 4
gpt4 key购买 nike

我有一对具有 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 对象需要被重新缓存后,它会对数据库进行多次调用,一次调用与 RoundObject 集合关联的每个唯一 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 对象时使用 includes 方法来包含 RoundObject。
它会像这样:

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

关于mysql - ActiveRecord自定义has_many关联多次调用数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23302926/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com