我有一个可以属于多个团队的玩家模型 团队属于一个类别并且具有颜色。 玩家也可以拥有一种颜色 每个类别的玩家可以属于一个团队 用户可以选择将类别设置为' 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方法的结果,但它没有改变任何东西。