我在Rails3应用程序中建模了以下关系:
class User < ActiveRecord::Base
has_and_belongs_to_many :skills
end
class SkillsUser < ActiveRecord::Base
end
class Skill < ActiveRecord::Base
has_and_belongs_to_many :users
end
“SkillsUser”模型表示用户和技能之间的多对多关联。这样,当用户添加新技能,并且所述技能已存在于“技能”表(即“Java”)中时,我只是在技能用户表中创建现有技能与用户之间的关系。一切都好。
在用户视图中,我显示了技能列表。我有一个片段缓存块包围这些技能。
<% cache([user,"skills"]) do %>
<div id="skills-grid">
<% user.sorted_skills.each do |s| %>
...
<% end %>
</div>
<% end %>
在单独的编辑页面上,用户可以添加或删除技能。此操作只是创建或删除skill_users记录。当发生这种情况时,我需要使片段缓存无效,以便在用户视图上适当地呈现技能。
所以我创建了一个CacheSweeper,其目的是观察skill_users关系。这是控制器:
class SkillsController < ApplicationController
autocomplete :skill, :name
cache_sweeper :skill_user_sweeper
def create
@user = User.find(params[:user_id])
#Make sure the current user has access to
#associate a skill to the user in the request
if(@user.id = current_user.id)
SkillsHelper.associate_skill(@user,params[:skill][:name])
@skill = Skill.find_by_name(params[:skill][:name])
end
respond_to do |format|
format.js
end
end
def destroy
@skill = Skill.find_by_id(params[:id])
@user = User.find_by_id(params[:user_id])
#Destroy the relationship, not the skill
@user.skills.delete(@skill) if(@skill.can_be_tweaked_by?(current_user))
respond_to do |format|
format.js
end
end
end
这是扫地车:
class SkillUserSweeper < ActionController::Caching::Sweeper
observe SkillsUser
def after_create(skill_user)
expire_cache_for(skill_user)
end
def after_update(skill_user)
expire_cache_for(skill_user)
end
def after_destroy(skill_user)
expire_cache_for(skill_user)
end
private
def expire_cache_for(skill_user)
expire_fragment([skill_user.user,"skills"])
end
end
问题是,在添加或删除skill_users记录后(在SkillsController上的“创建”或“销毁”之后),从不调用清扫器。在我的项目中我有其他清扫工,但他们都没有观察到多对多的关联。
我的问题是,如何创建一个CacheSweeper来观察“has_and_belongs_to_many”关联?
答案 0 :(得分:2)
我不能发表评论 - 抱歉
我会尝试使用user.id而不是用户作为密钥。即改变
<% cache([user,"skills"]) do %>
到
<% cache([user.id,"skills"]) do %>
我还会在回调中添加记录器消息以及SkillUserSweeper类中的记录器消息,以确保它被加载。