转换的重点其实只有一个,重点在于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内一次做完全部的方法
分享到:
相关推荐
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_...
1. **用户模型**:acts_as_authenticated通过在你的User模型中添加一个macro(方法)`acts_as_authenticated`,将认证逻辑注入到模型中。这包括密码哈希和验证、会话管理等。 2. **密码哈希**:该插件使用安全的...
#ActsAsCategory acts_as_category (Version 2.0 beta)acts_as_category,是acts_as插件在acts_as_tree风格的Ruby on Rails的ActiveRecord的模式,但有一些额外的功能,以及多种便捷视图助手。例子(有关实例方法和...
acts_as_list, 用于管理列表的ActiveRecord插件 ActsAsList描述这个 acts_as 扩展提供了对列表中的多个对象进行排序和重新排序的功能。 具有指定的类的类需要在映射的数据库表上定义为整数的position 列。 0.8.0升级...
"acts_as_paranoid" 是一个在Ruby on Rails框架中常用的gem,用于处理数据库记录的软删除(soft delete)。在数据库操作中,通常我们会遇到删除数据的需求,但直接删除可能会导致数据丢失,尤其是在生产环境中。...
在本篇讨论中,我们将深入理解如何使用`acts_as_rateable`以及它背后的原理。 首先,`acts_as_rateable`的基本概念是让一个模型(如文章、产品或评论)可以被其他用户评分。这通常涉及到两个主要的模型:评分者...
本文将深入探讨BetterNestedSet的原理、用法以及相较于acts_as_nested_set的优势。 1. Nested Set模型介绍 Nested Set模型是一种特殊的树形结构,每个节点都有左值(lft)和右值(rgt),通过这两个值可以快速定位...
介绍插件,用于对记录进行排序(使用 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,使在rails中创建api响应变得简单和有趣,一个api可以被认为是多个软件设备之间通信的指导手册。例如,api可用于web应用程序之间的数据库通信。通过提取实现并将数据放弃到对象中,api简化了编程...
acts_as_restful_list 就像acts_as_list 一样,但不必使用非标准方法调用(如insert_at)来弄乱您的代码,acts_as_restful_list 使管理列表变得简单。 您可以像更新其他任何内容一样更新 position 属性,其余的都...
active_record-acts_as, 模拟activerecord模型的多表继承 插件开发已经移动这个项目的积极发展已经转移到了的krautcomputing fork 。... ActiveRecord::ActsAs这是对 acts_as_relation的重构。模拟用于Acti
使徒行传 一个Rails插件来添加软删除。...用法安装gem: gem 'acts_as_paranoid' , '~> 0.7.0' bundle install创建迁移bin/rails generate migration AddDeletedAtToParanoiac deleted_at:datetime:index启用ActsAs
acts_as_sane_tree (用一些理智的方法建造树木) 在Postgresql> = 8.4的系统上,这是对act_as_tree的替代。这提供了什么 建立树木的快速方法。哪个版本的 轨道〜> 4.1.0 轨道〜> 4.0.0 导轨〜> 3.2.0 轨道〜> 3.1.0...
将acts_as_likeable添加到任何模型,它的实例可以被其他模型喜欢。 class Post < ActiveRecord :: Base acts_as_likeable end 利克模型 将acts_as_liker添加到任何模型,它可以喜欢其他模型的实例。 class ...
与acts_as_commentable 兼容(但需要更改数据库架构) 要求 此 gem 的 2.x 版本仅适用于 Rails 4 及更高版本。 对于此 gem 的 Rails 3.x 兼容版本,请使用版本 1.2.0。 这个宝石取决于 CollectiveIdea 的 Awesome ...
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+ ...
gem 'acts_as_aliased' 更新包后,运行 rails generate acts_as_aliased:install rake db:migrate 这将创建一个新表aliases 。 用法 假设您有一个需要别名的模型Company ,因为公司名称有不同的版本。 使用acts_as...
acts_as_xapian将Xapian的强大功能与Rails的优雅集成,使得开发者能够在Rails应用中轻松实现全文搜索功能。 该插件的主要特性包括: 1. **无缝集成**:acts_as_xapian能够无缝地与Rails模型集成,只需在模型中添加...
acts_as_shopping_cart 一个简单的购物车实现。 您可以找到示例应用程序。 安装 滑轨3 从0.2.0版开始,不再支持Rails 3。 如果您仍需要在Rails 3应用程序中实现此gem,请使用0-1-x分支 将其包含在您的Gemfile中 ...
文档基本用法例如, SubscriptionType是一个 ActiveRecord: require 'acts_as_reference_data'class SubscriptionType < ActiveRecord::Base acts_as_reference_dataend假设已创建迁移以使用各种类型填充此表,...