Ruby on rails 3 has的Rails3缓存清理程序,并且属于多个关联

Ruby on rails 3 has的Rails3缓存清理程序,并且属于多个关联,ruby-on-rails-3,caching,sweeper,Ruby On Rails 3,Caching,Sweeper,我在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 class用户

我在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  
class用户
“SkillsUser”模型表示用户和技能之间的多对多关联。这样,当用户添加一项新技能,并且该技能已经存在于“skills”表(即“Java”)中时,我只需在skills_users表中创建现有技能与用户之间的关系。一切都好

在用户视图中,我显示一个技能列表。我有一个片段缓存块围绕着这些技能

<% cache([user,"skills"]) do %>
<div id="skills-grid">
      <% user.sorted_skills.each do |s| %>
        ...
  <% end %>
</div>
<% end %>

...
在单独的编辑页面上,用户可以添加或删除技能。此操作只是创建或删除一个skills_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 SkillsController
这是清洁工:

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
class SkillUserSweeper
问题是,在添加或删除SkillsController上的skills_用户记录(在“创建”或“销毁”之后)之后,永远不会调用清理程序。我的项目中还有其他清洁工,但他们都没有观察到多对多的关联


那么,我的问题是,如何创建一个CacheSweaper来观察“has\u和\u belies\u to \u many”关联?

我会尝试使用user.id而不是user作为键。i、 e.变化

<% cache([user,"skills"]) do %>



我还将在回调中添加记录器消息,并在SkillUserSweeper类中添加记录器消息,以确保它已加载。

谢谢。我试过了,但技能使用者没有上膛。这可能是因为我没有显式地与控制器中的SkillsUserSweeper对象交互,因此Rails不会触发清理器操作。
<% cache([user.id,"skills"]) do %>