转换的重点其实只有一个,重点在于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_...
#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升级...
NULL 博文链接:https://moyuan.iteye.com/blog/263902
介绍插件,用于对记录进行排序(使用 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_shopping_cart 一个简单的购物车实现。 您可以找到示例应用程序。 安装 滑轨3 从0.2.0版开始,不再支持Rails 3。 如果您仍需要在Rails 3应用程序中实现此gem,请使用0-1-x分支 将其包含在您的Gemfile中 ...
NULL 博文链接:https://moyuan.iteye.com/blog/263853
文档基本用法例如, SubscriptionType是一个 ActiveRecord: require 'acts_as_reference_data'class SubscriptionType < ActiveRecord::Base acts_as_reference_dataend假设已创建迁移以使用各种类型填充此表,...
gem 'acts_as_nps_rateable' 如果要将此gem添加到rails 3应用程序,则应将行更改为: gem 'acts_as_nps_rateable', '=0.0.4' 然后执行: $ bundle 或将其自己安装为: $ gem install acts_as_nps_rateable 一旦...
为了使任何模型充当snapchat,只包括acts_as_snapchat在类定义: class User < ActiveRecord xss=removed> 1 sleep 10 User . count # => 0 如果您是 Node.js 开发人员,您可能更喜欢使用别名acts_as_mongodb 。 ...
作为Commentable与答复 ... gem 'acts_as_commentable_with_reply' 发电机 轨道4 ¶ ↑ rails g comment 然后迁移您的数据库以添加 comments 和 comment_reply 模型: rake db: migrate 用法¶ ↑ 使