gpt4 book ai didi

activerecord - 事件记录中的深度嵌套连接

转载 作者:行者123 更新时间:2023-12-03 23:43:05 24 4
gpt4 key购买 nike

我正在尝试优化我整个网站的查询。

我有 3 个模型,照片,人物,外观

照片有_多次露面,很多人通过露面
Appearances 表只有一个 person_id, photo_id

现在,如果我要搜索一个“人”并且我想急切地加载他们的外表和照片,我会做这样的事情:

 Person.joins(:appearances => :photo).limit(5)

现在,我不确定这是否理想,但假设我的人具有属于照片的外观,而照片又具有外观和其他人。我什至不知道你是否或如何在 vanilla SQL 中做到这一点,但我只是好奇这是否可能。
  Person.joins(:appearances => :photo => :appearaces => :person).limit(5)

这种语法会导致错误,再次,我只是好奇,我正在处理在我的 View 中获取照片的外观和人物,我只是想尝试加载时间,看看这是否可能。

最佳答案

对于“急切加载”,您使用 .include ; .join用于执行 INNER JOIN 功能。对于您的情况,您似乎可能会同时使用两者(加入获取照片,包括获取其他人)。我提出这一点是因为 .join单独不会执行预先加载(因此它会在访问关联实体时进行查询)。

如果您希望预先加载嵌套关联,您可以使用 Ruby on Rails 指南中概述的语法,网址为 http://guides.rubyonrails.org/active_record_querying.html#eager-loading-multiple-associations

沿着这些路线的东西会起作用吗?

Photo.joins(:appearances => :person).includes(:appearances => :person).limit(5)

还是需要从人入手?
Person.joins(:appearances => :photo).includes(:appearances => :photo => :appearaces => :person).limit(5)

另外,作为最后的(小)注意:您在最后一行代码中拼写错误的“:appearances”(它指出“:appearaces”),这可能会导致问题。

编辑:
经过一些小测试后,似乎将包含关联嵌套在
a => b => c => b => a

表格不起作用。但是,以下形式确实如此:
a => [b => [c => [b => a]]]

虽然,当然,它并不那么漂亮。

意思是,使用以下代码:
Person.includes(:appearances => [:photo => [:appearances => :person]]).find(38)       

生成了以下 SQL:
Person Load (0.3ms)  SELECT `persons`.* FROM `persons` WHERE `persons`.`id` = 38 LIMIT 1
Appearance Load (0.3ms) SELECT `appearances`.* FROM `appearances` WHERE (`appearances`.person_id = 38)
Photo Load (0.3ms) SELECT `photos`.* FROM `photos` WHERE (`photos`.`id` = 1904)
Appearance Load (0.3ms) SELECT `appearances`.* FROM `appearances` WHERE (`appearances`.photo_id = 1904)
Person Load (0.3ms) SELECT `persons`.* FROM `persons` WHERE (`persons`.`id` IN (38,346))

渴望从所有照片中加载其他人,其中包括 id #38 的人

关于activerecord - 事件记录中的深度嵌套连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13404843/

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