代码之家  ›  专栏  ›  技术社区  ›  Boss Nass

减少数据库查询

  •  0
  • Boss Nass  · 技术社区  · 13 年前

    我正在尝试减少数据库的负载,并且已经读到使用:include方法可以帮助实现这一点。 我目前有以下代码行,可以选择我需要的所有信息,但当我试图在视图中显示计数时,我会一次又一次地访问数据库

    @sports = Sport.includes([:teams]).all
    

    在我看来我在做

    - @sports.each do |sport|
      %tr
        %td= sport.name
        %td= sport.teams.count
    

    我怀疑sport.teams.count是导致数据库被反复查询的原因。我该怎么解决这个问题?

    2 回复  |  直到 13 年前
        1
  •  2
  •   Mischa    13 年前

    你应该使用 counter_cache 为此。另请参阅此 screencast .

        2
  •  1
  •   jvnill    13 年前

    正如mischa所说,你可以使用counter_cache来解决你的问题。但是您也可以查看这个sql语句来获取计数

    @sports = Sport.select('sports.*, (SELECT COUNT(*) FROM teams WHERE teams.sport_id = sports.id) AS teams_count')
    

    那么你就可以使用 sport.teams_count

    - @sports.each do |sport|
      %tr
        %td= sport.name
        %td= sport.teams_count