【问题标题】:Rails: extra db queries occurring on a has_one relationshipRails:在 has_one 关系上发生的额外数据库查询
【发布时间】:2016-12-30 17:17:29
【问题描述】:

我正在构建一个 Rails 应用程序,其中有模型:Team、Player、Team_Player 以及许多属于 Player 的统计模型。模型 Team_Player 充当连接 Teams 和 Players 的中间人。

我的问题是这样的:当我打电话给像

player = Player.find(team_player.player_id), 

rails 进行了大量的数据库调用,不仅对 Player 模型,而且对与 Player 相关的统计模型。我知道 rails 默认行为是不加载关联模型,除非我指定它。因此,我假设我已经在某处指定了这种行为。但是,老实说,我不确定我在哪里/如何做到这一点。我意识到这是一个奇怪的问题,但是鉴于以下情况,知道为什么要进行所有额外的数据库调用吗?

以下是我如何关联我的模型(带有示例统计模型):

class Team < ApplicationRecord
    has_many :team_players
end

class TeamPlayer < ApplicationRecord
    belongs_to :team
    belongs_to :player 
end


class Player < ApplicationRecord
    has_many :team_players
    has_one :passing_stats_season_total, dependent: :destroy

    delegate *PassingStatsSeasonTotal::ATTR_METHODS, to: :passing_stats_season_total

    after_initialize do
        self.build_passing_stats_season_total if passing_stats_season_total.nil?
    end 
end

class PassingStatsSeasonTotal < ApplicationRecord
    belongs_to :player

    ATTR_METHODS = [:attempts, :attempts=, etc.]
end

现在是我实际调用数据库的视图:

<tbody>
    <% @team.team_players.each do |team_player| %>
        <tr>
            <% player = Player.find(team_player.player_id) %>
            <td><%= player.name %></td>
            etc.
        </tr>
    <% end %>
</tbody>

这是控制台输出:

aPlayer = team.team_players.first
  TeamPlayer Load (0.3ms)  SELECT  "team_players".* FROM "team_players" WHERE "team_players"."team_id" = ? ORDER BY "team_players"."id" ASC LIMIT ?  [["team_id", 132], ["LIMIT", 1]]
 => #<TeamPlayer id: 1114, player_id: 8373, team_id: 132, created_at: "2016-12-30 00:11:42", updated_at: "2016-12-30 00:11:42"> 

player = Player.find(aPlayer.player_id)
  Player Load (0.1ms)  SELECT  "players".* FROM "players" WHERE "players"."id" = ? LIMIT ?  [["id", 8373], ["LIMIT", 1]]
  PassingStatsSeasonTotal Load (0.2ms)  SELECT  "passing_stats_season_totals".* FROM "passing_stats_season_totals" WHERE "passing_stats_season_totals"."player_id" = ? LIMIT ?  [["player_id", 8373], ["LIMIT", 1]]
 => #<Player id: # and a bunch of other stuff>

在这个例子中,为什么模型 PassingStatsSeasonTotal 也被加载了? 我意识到这是一个奇怪的问题,但任何帮助将不胜感激。

谢谢!

【问题讨论】:

  • 我认为它与after_initialize 块有关。
  • 好的,我会尝试摆脱那个块,然后在需要时在其他地方创建模型。
  • 谢谢!感谢您的帮助
  • 当我去掉 after initialize 语句时,它工作正常。谢谢!

标签: sql ruby-on-rails database associations


【解决方案1】:

您在这一行中的条件加载了PassingStatsSeasonTotal 关联:

self.build_passing_stats_season_total if passing_stats_season_total.nil?

原因是passing_stats_season_total 是对关联的引用。在调用任何方法之前,Rails 需要加载它。

【讨论】:

  • 啊,有道理。谢谢1
【解决方案2】:

我自己的回答:我删除了 after_initialize 块,并在需要时在其他地方简单地创建了一个统计模型。我不确定为什么 after_initialize 块改变了默认行为,但这就是发生的事情。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-11
    • 2020-03-14
    • 1970-01-01
    • 1970-01-01
    • 2016-06-10
    • 2013-11-28
    • 1970-01-01
    相关资源
    最近更新 更多