`

改个bug

阅读更多
问题见:http://yuan.iteye.com/blog/575569#comments 2楼
下面是过程。
入口是tag_list=
grep 'def tag_list=' ./ -r

在vendor/plugins/acts_as_taggable_on_steroids/lib/acts_as_taggable.rb文件中。
定义在ActiveRecord::Acts:Taggable::InstanceMethods里。只有一行代码:
def tag_list=(value)
  @tag_list = TagList.from(value)
end

接着找class TagList:
grep 'class TagList' ./ -r

位置:vendor/plugins/acts_as_taggable_on_steroids/lib/tag_list.rb
  class << self
    # Returns a new TagList using the given tag string.
    #   
    #   tag_list = TagList.from("One , Two,  Three")
    #   tag_list # ["One", "Two", "Three"]
    def from(source)
      returning new do |tag_list|
     
        case source
          when Array
            tag_list.add(source)
          else
            string = source.to_s.dup
     
            # Parse the quoted tags
            [   
              /\s*#{delimiter}\s*(['"])(.*?)\1\s*/,
              /^\s*(['"])(.*?)\1\s*#{delimiter}?/
            ].each do |re|
              string.gsub!(re) { tag_list << $2; "" }
            end 
     
            tag_list.add(string.split(delimiter))#分隔符就在这处理了
        end 
      end 
    end 
  end 

add方法:
  # Add tags to the tag_list. Duplicate or blank tags will be ignored.
  #
  #   tag_list.add("Fun", "Happy")
  # 
  # Use the <tt>:parse</tt> option to add an unparsed tag string.
  #
  #   tag_list.add("Fun, Happy", :parse => true)
  def add(*names)
    extract_and_apply_options!(names)
    concat(names)
    clean!
    self
  end

嗯,原来add可以带个参数:parse=> false|true。
怎么没看到数据库操作……哦,对了,调用tag_list=的时候不保存的。应该是在save的时候。
Module ClassMethods
#................
  after_create :save_tags
  after_update :save_tags
#.............
end

Module InstanceMethods
#......
  def save_tags
    return unless @tag_list

    new_tag_names = @tag_list - tags.map(&:name)
    old_tags = tags.reject { |tag| @tag_list.include?(tag.name) }

    self.class.transaction do
      if old_tags.any?
        taggings.find(:all, :conditions => ["tag_id IN (?)", old_tags.map(&:id)]).each(&:destroy)
        taggings.reset
      end

      new_tag_names.each do |new_tag_name|
        tags << Tag.find_or_create_with_like_by_name(new_tag_name)
      end
    end
    true
  end
#......
end

嗯,在transaction里边加点东西:
  self.class.transaction do
    if old_tags.any?
      taggings.find(:all, :conditions => ["tag_id IN (?)", old_tags.map(&:id)]).each(&:destroy)
      taggings.reset
      Tag.clear_unused old_tags ####加这么一句
    end 
                
    new_tag_names.each do |new_tag_name|
      tags << Tag.find_or_create_with_like_by_name(new_tag_name)
    end 
  end 

然后找到Tag类,添加一个方法:
class Tag < ActiveRecord::Base
  #......
  class << self
    #......
    def clear_unused(tags=[])
      if tags.empty?
        find(:all).select{|tag| tag.taggings.empty?}.each(&:destroy)
      else
        find(:all, :conditions => ['id IN (?)', tags.map(&:id)]).select{|tag| tag.taggings.empty?}.each(&:destroy)
      end 
    end 

    #......
  end
  #......
end

大功告成。
代码不知道还能改好看些不
分享到:
评论
5 楼 yuan 2010-01-28  
机器人 写道
哈哈哈哈

呵呵..
4 楼 机器人 2010-01-27  
哈哈哈哈
3 楼 yuan 2010-01-27  
回信来了:
引用
Hello Yuan,

Thank you for your work.

You can already use Tag.destroy_unused if you want to destroy tags that are no longer used. Set it to true in the environment somewhere:

  Tag.destroy_unused = true

Does that do what you want?

是我太粗心了……
2 楼 夜鸣猪 2010-01-21  






学习一下,留
1 楼 yuan 2010-01-20  
发了个邮件 

相关推荐

    androidBug修改总结

    AndroidBug修改总结涉及的内容主要包括以下几个方面: 1. **系统图标位置的调整**:在Android系统的定制开发中,开发者可能需要调整系统图标的显示位置。这通常涉及到对Android系统资源文件的修改,比如替换或编辑...

    修改文档bug意见

    根据用户提出的修改意见,进行用户需求的跟踪修改。

    bugfree改造文档

    提供的两个文件名称——"第一次使用《开贝影擎》.txt"和"开贝影擎v1.13(免费版)"——似乎与Bugfree改造主题关联不大,它们可能是指用于辅助编辑或生成项目报告的工具,如"开贝影擎"可能是一个视频编辑软件的版本,...

    贪吃蛇——改了几个bug

    这个项目标题“贪吃蛇——改了几个bug”表明这是一个关于修复“贪吃蛇”游戏错误的工作。下面将详细讨论在游戏开发中可能遇到的bug类型以及修复它们的方法。 贪吃蛇游戏的基本机制是玩家控制一条蛇在有限的区域内...

    QC后台配置按照用户组修改Bug状态

    - 开发者(Developer组)打开Bug时,只显示"Fixed"和"Rejected"这两个状态供选择(如图3-4所示)。 - 测试人员(QATester组)则看到"Closed"和"Reopen"状态(如图3-5所示),这确保了角色之间的职责明确,避免了...

    ecm bug 修改

    "ECM_右键ascii比较bug修改"这个文件名可能指向一个具体的bug实例,其中用户在ECM系统中右键点击某项内容时,出现ASCII比较错误。ASCII是一种字符编码标准,用于将字符转换为数字,以便计算机处理。在ECM系统中,...

    校验两个数据库表差异,并生成修改语句(BATE版,可能有BUG)

    校验两个数据库表差异,并生成修改语句(BATE版,可能有BUG)校验两个数据库表差异,并生成修改语句(BATE版,可能有BUG)校验两个数据库表差异,并生成修改语句(BATE版,可能有BUG)校验两个数据库表差异,并生成修改语句(BATE...

    TFS Bug管理使用教程

    完成代码修改并更新到测试环境后,将Bug状态改为“已解决”,保存更改。 4. **测试人员关闭Bug** 测试人员查询“我创建的Bug”,查找状态为“已解决”的Bug进行回归测试。确认问题已修复后,将Bug状态改为“已关闭...

    CSI Bug修改记录

    直接通过eclipse导入工具,然后添加POI包 博文链接:https://coderdream.iteye.com/blog/247033

    软件测试BUG清单分析说明

    如果一个BUG与其他多个功能或错误有关联,且影响范围广泛,那么它的关联度评分就会升高。 测试人员应该对上述各项指标进行详尽的评估,并与开发团队进行充分沟通。通过这种方式,双方可以对BUG的紧急程度和修复...

    bugfreee一个bug管理系统jsp+mysql

    "增"即添加新的bug报告,"删"是删除不再需要的bug记录,"改"用于更新bug的状态或相关信息,"查"则涉及查询和筛选bug,以便进行跟踪和修复。 在技术选型上,Bugfree选择了JSP(JavaServer Pages)作为前端展示层,这...

    千年服务端自身bug分析与防范彻底杜绝服务_db数据_千年_千年。数据修改_

    综上所述,对“千年”服务端bug的分析和防范是一项系统工程,涉及到服务器架构、数据库管理、网络安全等多个方面。只有通过持续的努力和改进,才能确保服务的稳定,为玩家提供无瑕疵的游戏体验。对于任何游戏服务端...

    在修改代码时存在的bug

    在编程和软件开发中,"在修改代码时存在的bug"是一个常见的挑战,特别是在涉及图像处理的项目中。图像处理是一个复杂且技术含量高的领域,它涉及到计算机视觉、图像分析、算法设计等多个方面。C++是一种广泛用于这类...

    uploadify大文件多文件上传在asp.net的使用,修改删除的bug和覆盖bug包括IIS配置

    uploadify 其中有一个bug是,已经上传完成的文件,点击取消上传后,后台是不会跑去删除已经上传的文件的,它没有调用oncancel事件,这部分只能自己去写代码实现删除,下面会讲到这一块。我们先建立好一些普通的功能...

    如何用ChatGPT改bug

    如何用ChatGPT改bug

    BUG描述语言规范

    * 标识符:每一个测试用例都应该有一个唯一的标识符 * 测试项:测试用例应该准确的描述所需要测试的项以及其特征 * 测试环境要求:用来表征该测试用例需要的测试环境 * 输入标准:用来执行测试用例的输入需求 * 输出...

    阿里云播放器修改bug

    4. **AliVideoManageModify**:这个文件名可能是修复bug后的更新版本或者修改记录,可能包含了对播放器管理模块的改进。"Manage"通常与控制、配置或维护播放器的各个方面有关,而"Modify"则表示这些方面进行了调整或...

    Bug处理流程规范

    Bug处理流程规范 本规范旨在提高测试以及产品缺陷修改效率,避免出现搁置和遗漏的缺陷,从而提高产品的质量,降低质量检查和缺陷修改成本。 一、引言 本规范适用于研发部门(Confernece、Flash、监控)、质量保证...

    禅道Bug提交管理规范

    禅道Bug提交管理规范 测试流程管理。 本文档定义了bug管理流程及其bug相关信息内容。

    淘宝bug展示图片

    10. **修复策略**:修复bug通常包括复现问题、定位原因、修改代码、测试验证和上线部署等多个步骤,每一步都需要专业技能和严谨态度。 在淘宝这样的大流量平台,bug管理通常涉及严格的流程,包括bug报告、优先级...

Global site tag (gtag.js) - Google Analytics