`
taito
  • 浏览: 96433 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

将旧有的Acts_As_Tree转成Acts_As_Threaded

阅读更多
转换的重点其实只有一个,重点在于lft和rgt两个字段的初始化,否则其他字段的初始
化对会写程序的人应该难不倒才是,转换的相异点来自于新增四个字段:root_id(根ID)
、lft(左值)、rgt(右值)、depth(深)

改成这样好处多多,可以使用单一query取得"所有"子代(不限阶层),且所有子代count
详情请参阅Acts_As_Threaded

以下是转换实做的部份,用于"Cate"这个model
[[Migrate]]

class FixCate < ActiveRecord::Migration 
    def self.up 
        puts "fixing Cate" 
            Cate.reset_column_information 
            Cate.find(:all).each do |c| 
                if c.parent_id == nil 
                    c.parent_id = 0 
                    c.update 
                end 
            end 
        puts "fixed Cate" 
        change_column "cates" , "parent_id",    :integer,  :default => 0,  :null => false 
        add_column "cates" , "root_id",    :integer,   :default => 0,  :null => false 
        add_column "cates" , "lft",        :integer 
        add_column "cates" , "rgt",        :integer 
        add_column "cates" , "depth",      :integer,   :default => 0,  :null => false 
        puts "fixing Cate" 
            Cate.reset_column_information 
            Cate.find(:all).each do |c| 
                if c.parent_id == 0 
                    c.root_id = c.id 
                    c.update 
                end 
            end 
        puts "fixed Cate" 
    end 

    def self.down 
        change_column "cates" , "parent_id",       :integer 
        remove_column "cates" , "root_id" 
        remove_column "cates" , "lft" 
        remove_column "cates" , "rgt" 
        remove_column "cates" , "depth" 
        puts "fixing Cate" 
            Cate.reset_column_information 
            Cate.find(:all).each do |c| 
                if c.parent_id == 0 
                    c.parent_id = nil 
                    c.update 
                end 
            end 
        puts "fixed Cate" 
    end 
end 


[[cate.rb (Model)]]
class Cate < ActiveRecord::Base 
    acts_as_threaded 
    def parent 
        if self.parent_id == 0 
            return nil 
        else 
            return Cate.find(self.parent_id) 
        end 
    end 
    def children 
        #direct_children与all_children选一个使用 
        return self.direct_children 
    end 
end

[[cates_controller.rb (Controller)]] 
class CatesController < ApplicationController 
  def init 
      Cate.find(:all).each do |c| 
          c.before_create 
          c.after_create 
      end 
  end 
end


简单的来说,就是在migrate时做基本的转换与初始化,将parent_id = null转为parent_id = 0,然后将parent_id = 0的实体(root)的root_id改为自己(self.id),这样就完成基本的两个字段的初始化。

Model内新增两个method来复写掉继承的mothod,Acts_As_Threaded预设没有parent与children这两个method,且如果之前用Acts_As_Tree实做的话,通常root实体的parent的值通常为null,而修正后会变为0,所以需要另外复写。

因为migrate没有支持完整的Rails与AR与plugin,所以最后一步的初始化要留到全部建立好后,在Controller内执行才行,上面的Controller内写的init就是初始化的方式,执行一次即可。

如果详细看Acts_As_Threaded内的语法就会得知lft与rgt的migeate为何没加入":default => 0, :null => false"这段语法与为何要那样的初始化,不过还是希望有神人可以想出在migrate内一次做完全部的方法
1
0
分享到:
评论

相关推荐

    acts_as_list.rar

    acts_as_list.raracts_as_list.raracts_as_list.raracts_as_list.raracts_as_list.raracts_as_list.raracts_as_list.raracts_as_list.raracts_as_list.raracts_as_list.raracts_as_list.raracts_as_list.raracts_as_...

    acts_as_authenticated

    1. **用户模型**:acts_as_authenticated通过在你的User模型中添加一个macro(方法)`acts_as_authenticated`,将认证逻辑注入到模型中。这包括密码哈希和验证、会话管理等。 2. **密码哈希**:该插件使用安全的...

    acts_as_category:想想acts_as_tree +权限

    #ActsAsCategory acts_as_category (Version 2.0 beta)acts_as_category,是acts_as插件在acts_as_tree风格的Ruby on Rails的ActiveRecord的模式,但有一些额外的功能,以及多种便捷视图助手。例子(有关实例方法和...

    acts_as_list, 用于管理列表的ActiveRecord插件.zip

    acts_as_list, 用于管理列表的ActiveRecord插件 ActsAsList描述这个 acts_as 扩展提供了对列表中的多个对象进行排序和重新排序的功能。 具有指定的类的类需要在映射的数据库表上定义为整数的position 列。 0.8.0升级...

    acts_as_paranoid

    "acts_as_paranoid" 是一个在Ruby on Rails框架中常用的gem,用于处理数据库记录的软删除(soft delete)。在数据库操作中,通常我们会遇到删除数据的需求,但直接删除可能会导致数据丢失,尤其是在生产环境中。...

    用acts_as_rateable实现简单的打分功能

    在本篇讨论中,我们将深入理解如何使用`acts_as_rateable`以及它背后的原理。 首先,`acts_as_rateable`的基本概念是让一个模型(如文章、产品或评论)可以被其他用户评分。这通常涉及到两个主要的模型:评分者...

    acts_as_nested_set的增强版BetterNestedSet

    本文将深入探讨BetterNestedSet的原理、用法以及相较于acts_as_nested_set的优势。 1. Nested Set模型介绍 Nested Set模型是一种特殊的树形结构,每个节点都有左值(lft)和右值(rgt),通过这两个值可以快速定位...

    rails_admin_acts_as_list:rails_admin插件以对记录进行排序

    介绍插件,用于对记录进行排序(使用 gem)安装要启用rails_admin_acts_as_list,请将以下内容添加到您的Gemfile : gem 'rails_admin_acts_as_list'gem 'rails_admin' 重要提示: rails_admin_acts_as_list之前必须...

    Api-acts_as_api.zip

    Api-acts_as_api.zip,使在rails中创建api响应变得简单和有趣,一个api可以被认为是多个软件设备之间通信的指导手册。例如,api可用于web应用程序之间的数据库通信。通过提取实现并将数据放弃到对象中,api简化了编程...

    acts_as_restful_list:就像acts_as_list一样,但很安静

    acts_as_restful_list 就像acts_as_list 一样,但不必使用非标准方法调用(如insert_at)来弄乱您的代码,acts_as_restful_list 使管理列表变得简单。 您可以像更新其他任何内容一样更新 position 属性,其余的都...

    active_record-acts_as, 模拟activerecord模型的多表继承.zip

    active_record-acts_as, 模拟activerecord模型的多表继承 插件开发已经移动这个项目的积极发展已经转移到了的krautcomputing fork 。... ActiveRecord::ActsAs这是对 acts_as_relation的重构。模拟用于Acti

    acts_as_paranoid:ActiveRecord插件可让您隐藏和还原记录,而无需实际删除它们

    使徒行传 一个Rails插件来添加软删除。...用法安装gem: gem 'acts_as_paranoid' , '~&gt; 0.7.0' bundle install创建迁移bin/rails generate migration AddDeletedAtToParanoiac deleted_at:datetime:index启用ActsAs

    acts_as_sane_tree:用于ActiveRecord和PostgreSQLSane树构建器

    acts_as_sane_tree (用一些理智的方法建造树木) 在Postgresql&gt; = 8.4的系统上,这是对act_as_tree的替代。这提供了什么 建立树木的快速方法。哪个版本的 轨道〜&gt; 4.1.0 轨道〜&gt; 4.0.0 导轨〜&gt; 3.2.0 轨道〜&gt; 3.1.0...

    acts_as_liked:向任何 Active Record 模型添加类似功能

    将acts_as_likeable添加到任何模型,它的实例可以被其他模型喜欢。 class Post &lt; ActiveRecord :: Base acts_as_likeable end 利克模型 将acts_as_liker添加到任何模型,它可以喜欢其他模型的实例。 class ...

    acts_as_commentable_with_threading:类似于acts_as_commentable; 然而,利用 awesome_nested_set 提供线程评论

    与acts_as_commentable 兼容(但需要更改数据库架构) 要求 此 gem 的 2.x 版本仅适用于 Rails 4 及更高版本。 对于此 gem 的 Rails 3.x 兼容版本,请使用版本 1.2.0。 这个宝石取决于 CollectiveIdea 的 Awesome ...

    actions_as_commentable:ActiveRecord acts_as_commentable插件

    gem 'acts_as_commentable' Rails gem 'acts_as_commentable' , '3.0.1' Rails gem 'acts_as_commentable' , git: 'git@github.com:jackdempsey/acts_as_commentable.git' , branch: '2.x' 生成器 Rails 3+ ...

    acts_as_aliased:扩展 ActiveRecord

    gem 'acts_as_aliased' 更新包后,运行 rails generate acts_as_aliased:install rake db:migrate 这将创建一个新表aliases 。 用法 假设您有一个需要别名的模型Company ,因为公司名称有不同的版本。 使用acts_as...

    acts_as_xapian:Xapian全文搜索插件,适用于Ruby on Rails

    acts_as_xapian将Xapian的强大功能与Rails的优雅集成,使得开发者能够在Rails应用中轻松实现全文搜索功能。 该插件的主要特性包括: 1. **无缝集成**:acts_as_xapian能够无缝地与Rails模型集成,只需在模型中添加...

    acts_as_shopping_cart:简单的购物车实施

    acts_as_shopping_cart 一个简单的购物车实现。 您可以找到示例应用程序。 安装 滑轨3 从0.2.0版开始,不再支持Rails 3。 如果您仍需要在Rails 3应用程序中实现此gem,请使用0-1-x分支 将其包含在您的Gemfile中 ...

    acts_as_reference_data

    文档基本用法例如, SubscriptionType是一个 ActiveRecord: require 'acts_as_reference_data'class SubscriptionType &lt; ActiveRecord::Base acts_as_reference_dataend假设已创建迁移以使用各种类型填充此表,...

Global site tag (gtag.js) - Google Analytics