gpt4 book ai didi

ruby-on-rails - Rails ActiveRecord 助手查找方法不急于加载关联

转载 作者:行者123 更新时间:2023-12-01 02:50:05 25 4
gpt4 key购买 nike

我有以下模型:Game 和 Pick。 Game 和 Pick 之间存在一对多的关联。还有第三个模型叫做 Player,一个 Player 有很多 Picks。

Player 类中有一个方法可以为给定的游戏找到一个选择,或者如果它不存在则创建一个新的。

class Player < ActiveRecord::Base
has_many :picks

def pick_for_game(game)
game_id = game.instance_of?(Game) ? game.id : game
picks.find_or_initialize_by_game_id(game_id)
end
end

我想急切地为每个选择加载游戏。但是,如果我这样做
picks.find_or_initialize_by_game_id(game_id, :include => :game)

它首先在此查询运行时获取选择(该方法运行多次),然后在访问每个选择时获取游戏。如果我将 default_scope 添加到 Pick 类
class Pick < ActiveRecord::Base
belongs_to :game
belongs_to :player
default_scope :include => :game
end

它仍然为每个选择生成 2 个选择语句,但现在它在选择后立即加载游戏,但它仍然没有像我期望的那样进行连接。
Pick Load (0.2ms)  SELECT "picks".* FROM "picks" WHERE "picks"."game_id" = 1 AND ("picks".player_id = 1) LIMIT 1
Game Load (0.4ms) SELECT "games".* FROM "games" WHERE ("games"."id" = 1)

最佳答案

一、 find 不支持 includejoin作为参数。 (正如 mipsy 所说, find 支持 include 没有意义,因为它与稍后加载的查询数量相同。)
二、include急切地加载关联,所以像

Person.includes(:company)
大致相当于:
Person.all.each { |person| Company.find(person.company_id) }
我说大致相当于因为前者有 O(1) (实际上是两个)查询,而后者是 O(n)查询,其中 n是人数。
然而,连接只是一个查询,但连接的缺点是您不能总是使用检索到的数据来更新模型。要进行连接,您可以执行以下操作:
Person.join(:companies)
您可以在 joining tables in the Rails Guide 上阅读更多信息.
总而言之,join 不是急切加载,因为它不是加载关联,而是一次加载两个数据。我意识到两者之间有一条奇怪的细线,但急切加载是抢先获取其他数据,但稍后您不会通过连接获取该数据,或者您已经在原始查询中获取了它!希望这是有道理的。

关于ruby-on-rails - Rails ActiveRecord 助手查找方法不急于加载关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5520263/

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