通过多对多关系查询Rails缓存方法结果

时间:2015-05-19 17:02:34

标签: ruby-on-rails caching

我有一个可以属于多个团队的玩家模型 团队属于一个类别并且具有颜色。 玩家也可以拥有一种颜色 每个类别的玩家可以属于一个团队 用户可以选择将类别设置为' primary'这意味着将使用此类别的颜色。

class Player < ActiveRecord::Base
  has_many :team_memberships
  has_many :teams, :through => 'team_memberships'
  has_many :categories, :through => 'teams'
end

class TeamMembership < ActiveRecord::Base
  belongs_to :team
  belongs_to :player
end

class Team < ActiveRecord::Base
  belongs_to :category
  attr_accessible :color, :name

  has_many :team_memberships
  has_many :players, :through => :team_memberships
end

class Category < ActiveRecord::Base
  has_many :teams
  has_many :team_memberships, :through => :teams
  has_many :players, :through => :team_memberships
end

我有一个方法可以返回特定类别的玩家团队,我有一个方法可以返回要在玩家索引页面上显示的颜色。它从玩家本身,主要团队或第一类可用的团队获得颜色。

class Player < ActiveRecord::Base
  def index_color
    if self[:color].blank?
      if self.categories.size > 0
        if self.categories.primary.size > 0
          return self.team_for(self.categories.primary.first).color
        else
          return self.team_for(self.categories.first).color
        end
      end
    else
      return self[:color]
    end
  end

  def team_for(cat)
    teams_ids = cat.teams.map{|team| team.id}
    membership = TeamMembership.where(:player_id => self.id, :team_id => [team_ids]).first
    if membership
      return membership.team
    else
      return nil
    end
  end
end

由于我有很多玩家,这个颜色请求会大大减慢我的索引页面的显示速度。由于这很少改变,我想缓存结果。 我尝试使用Rails.cache.fetch

封装该方法
def index_color
  Rails.cache.fetch("players/#{self.id}/color") do
  ...
  end
end

但它似乎不起作用,因为我仍然有数百个来自index_color方法的TeamMembership查询。我还试图缓存team_for方法的结果,但它没有改变任何东西。

0 个答案:

没有答案