接着上一篇文章继续,awesome_nested_set是nested set 领域模型模式的继承。它是acts_as_nested_set 和 BetterNestedSet的替代品,但是更优秀。版本2支持rails3,想要使用rails2请下载prior版本。正如github文档中所说的一样,它是一个基于BetterNestedSet的nested set的继承,修复了一些bug,移除了大量重复的东西,添加了一些有用的方法,并且添加了STI支持。
继续使用上一个项目
1.在gemfile文件中添加awesome_nested_set和ztree
#上下级关系
gem 'awesome_nested_set'
#jquery树插件
gem 'jquery-ztree-rails'
2.执行bundle install
3.由于awesome_nested_set需要使用的四个字段,parent_id,lft,rgt,depth,上一篇文章中我们在department中只填了parent_id,lft,rgt,这次我们把depth添加到department表中,执行命令
ctrl+alt+g -> migration add_depth_to_department
class AddDepthToDepartment < ActiveRecord::Migration
def change
add_column :departments, :depth, :integer
end
end
4.执行rake命令 db:migrate 将迁移文件内容持久化到数据库中
5.在model中修改department.rb文件
class Department < ActiveRecord::Base
belongs_to :parent, class_name: 'Department'
has_many :person, -> { order("position ASC") }
acts_as_list
acts_as_nested_set
end
6.在application.js和application.css中添加ztree的引入
//= require jquery
//= require jquery_ujs
//= require turbolinks
//= require ztree.all
//= require_tree .
*= require_self
*= require ztree
*= require_tree .
7.修改views/departments/index.html.erb文件
<h1>Listing departments</h1>
<table>
<thead>
<tr>
<th>ID</th>
<th>Name</th>
<th>Parent</th>
<th>Lft</th>
<th>Rgt</th>
<th>Depth</th>
<th>Position</th>
<th>Remark</th>
<th></th>
<th></th>
<th></th>
</tr>
</thead>
<tbody>
<% @departments.each do |department| %>
<tr>
<td><%= department.id %></td>
<td><%= department.name %></td>
<td><%= department.parent_id %></td>
<td><%= department.lft %></td>
<td><%= department.rgt %></td>
<td><%= department.depth %></td>
<td><%= department.position %></td>
<td><%= department.remark %></td>
<td><%= link_to 'Show', department %></td>
<td><%= link_to 'Edit', edit_department_path(department) %></td>
<td><%= link_to 'Destroy', department, method: :delete, data: { confirm: 'Are you sure?' } %></td>
</tr>
<% end %>
</tbody>
</table>
<br>
<%= link_to 'New Department', new_department_path %>
<table>
<tr style="width: 600px">
<td style="width: 200px">
<span id="department_tree_Demo1" class="ztree" style="width: 200px"></span>
</td>
<td style="width: 200px">
<span id="department_tree_Demo2" class="ztree" style="width: 200px"></span>
</td>
<td style="width: 200px">
<span id="department_tree_Demo3" class="ztree" style="width: 200px"></span>
</td>
</tr>
</table>
<%= javascript_include_tag "common/tree" %>
8.在departments_controller中添加tree_data方法
#加载部门树
def tree_data
@departments = Department.find(params[:id]).self_and_descendants
render 'common/tree'
end
9.在views/common中添加tree.json.jbuilder文件,将数据转化为json格式供ztree使用
json.array!(@departments) do |department|
json.id department.id
json.parent_id department.parent_id
json.name department.name
end
10.在assets/javascripts/common添加tree.coffee文件
$ = jQuery
#浏览器报错cannot resolve symbol 'msie' 解决方法
jQuery.browser = {}
$ ->
jQuery.browser.msie = false
jQuery.browser.version = 0
if(navigator.userAgent.match(/MSIE ([0-9]+)\./))
jQuery.browser.msie = true
jQuery.browser.version = RegExp.$1
if !$.fn.commom
$.fn.commom = {}
#ztree设置
_default_setting = {
check: {
enable: true #checkbox可用
},
data: {
simpleData: {
enable: true,
idKey: "id",
pIdKey: "parent_id",
rootKey: "0"
}
}
}
$.fn.commom.department_tree1 =
init: (obj, setting) ->
init_tree(obj, setting, this.node_data())
node_data: ->
$nodes = null
$.ajax '/departments/tree_data/2.json',
type: 'GET'
detaType: 'json'
async: false
error: (jqXHR, textStatus, errorThrown) ->
alert('获取信息失败')
success: (data, textStatus, jqXHR) ->
$nodes = data
$nodes
$.fn.commom.department_tree2 =
init: (obj, setting) ->
init_tree(obj, setting, this.node_data())
node_data: ->
$nodes = null
$.ajax '/departments/tree_data/3.json',
type: 'GET'
detaType: 'json'
async: false
error: (jqXHR, textStatus, errorThrown) ->
alert('获取信息失败')
success: (data, textStatus, jqXHR) ->
$nodes = data
$nodes
$.fn.commom.department_tree3 =
init: (obj, setting) ->
init_tree(obj, setting, this.node_data())
node_data: ->
$nodes = null
$.ajax '/departments/tree_data/4.json',
type: 'GET'
detaType: 'json'
async: false
error: (jqXHR, textStatus, errorThrown) ->
alert('获取信息失败')
success: (data, textStatus, jqXHR) ->
$nodes = data
$nodes
#生成树
init_tree =(obj, setting, nodes = null) ->
#加载node
$ztree = $.fn.zTree.init($(obj), setting, nodes);
$ztree
$.fn.commom.department_tree1.init('#department_tree_Demo1', _default_setting)
$.fn.commom.department_tree2.init('#department_tree_Demo2', _default_setting)
$.fn.commom.department_tree3.init('#department_tree_Demo3', _default_setting)
11.在routes中添加路由
get 'departments/tree_data/:id' => 'departments#tree_data'
resources :departments
12.在views/people/index.html.erb中添加department链接
<%= link_to 'New Person', new_person_path %>
<%= link_to 'Department_list', departments_path %>
13.运行程序,向department中添加一系列数据
14.添加的数据展示
15.ztree属性结构展示
16.更多文档,请参考github,
awesome_nested_set
17.程序源代码将在以后得文章中给出。
分享到:
相关推荐
要使用awesome_nested_set您的模型需要具有3个字段: lft , rgt和parent_id 。 这些字段的名称是可配置的。 您还可以具有可选字段: depth和children_count 。 这些字段是可配置的。 请注意, c
Nested Set模型是一种特殊的树形结构,每个节点都有左值(lft)和右值(rgt),通过这两个值可以快速定位节点的层级和兄弟节点。这种模型的优点在于插入、删除和遍历节点时效率较高,适合大量数据的场景。 2. acts_...
与和awesome_nested_set一起使用。 奖励功能: 对带有rails_admin_toggleable的已enabled列的特殊情况支持 cover和image栏的特殊情况支持 安装 将此行添加到应用程序的Gemfile中: gem 'rails_admin_nested_set...
awesome_rails_console, Rails 控制台增强使你的Rails 控制台更加出色 使你的Rails 控制台非常出色这个 gem 是由使用pry生产,jazz_hands和 jazz_fingers的激发 was 。awesome_rails_console的优点是:减少 gem ...
嵌套集使用引用而不是嵌入式文档表示MongoDB中树的层次结构。 一棵树作为文档的平面列表存储在集合中。 嵌套集允许对节点及其后代进行快速,有序的查询。 修改树的成本更高。 嵌套设置模式非常适合于读取比修改更...
这个宝石取决于 CollectiveIdea 的 Awesome Nested Set gem。 如果安装此 gem 时尚未存在,则会安装它。 你可以在 GitHub 上的上找到这个 gem 安装 在您的 Gemfile 中,添加: gem 'acts_as_commentable_with_...
安装 go get github.com/griffinqiu/go-nested-set用法定义模型您必须使用nestedset Stuct标记来定义Gorm模型,如下所示: 支持结构标签: id -int64-节点的主键parent_id -sql.NullInt64-ParentID列,null为根lft...
awesome_rails_console的优点是: 更少的宝石依赖关系(仅使用除prail-rails和awesome_print之外的rails。其余都是可选的) 更简单的提示修改(类似于你已经熟悉的默认提示) 无需担心配置(因为反正没有太多选择)...
《Rails101_by_rails4.0》是一本专注于Rails 4.0.0版本和Ruby 2.0.0版本的自学教程书籍,它定位于中文读者,旨在成为学习Rails框架的参考教材。Rails(Ruby on Rails)是一个采用Ruby语言编写的开源Web应用框架,它...
当我们需要在 rails 中创建嵌套表单时,我们使用了nested_form gem。 但是如果你使用 AngularJS 作为前端,那么你就不能使用它。 当您希望嵌套表单使用 AngularJS 时,您需要编写自己的代码。 在这个应用程序中,我...
拖放GUI渲染树渲染嵌套选项可扩展树关键词很棒的嵌套集,嵌套集,Ruby,Rails,嵌套集视图助手,可排序的嵌套集,嵌套集的拖放GUI,嵌套集的查看助手,渲染树安装Gemfile (Rails 3,Rails 4) gem 'awesome_nested_...
在构建复杂的Rails应用时,性能优化是至关重要的。Rails,作为一个强大的Web开发框架,虽然提供了丰富的功能和便利性,但如果不进行适当的优化,可能会导致应用程序响应时间变慢,资源消耗过大,甚至影响用户体验。...
Rails 6设计示例 这是一个示例应用程序,是使用omni github auth设计Rails 6中的auth的基本模板。 建立 Ruby on Rails Webpack引导 Github OAuth 开始使用 要求 Ruby 2.6 导轨6 工头宝石 克隆 git clone ...
rails_semantic_logger, Rails 语义记录器用语义记录器替换 Rails 缺省记录器 Rails 语义记录器 语义记录器用语义记录器替代 Rails 缺省记录器。http://github.com/rocketjob/rails_semantic_logger文档有关完整文档...
12. **Rails最佳实践**:学习并遵循Rails社区推崇的最佳实践,如命名规范、代码结构和风格,以提高代码可读性和维护性。 当你解压"Rails_Full_Version"并开始开发时,可以参考这些知识点逐步构建和定制你的后台管理...
rails_apps_composer, 一个 gem,为 Rails 启动应用程序创建 Rails 应用程序模板 Rails 应用编辑器 Rails 应用程序编辑器 gem 安装一个 命令行 工具来从"食谱"的Collection 组装 Rails 应用程序。"你可以使用 rails_...
介绍插件,用于对记录进行排序(使用 gem)安装要启用rails_admin_acts_as_list,请将以下内容添加到您的Gemfile : gem 'rails_admin_acts_as_list'gem 'rails_admin' 重要提示: rails_admin_acts_as_list之前必须...
《InspiniaAdmin 2.6.1 Rails Full Version 深度解析》 InspiniaAdmin 2.6.1 Rails Full Version 是一个专为Web应用开发设计的全面的后台管理框架,它基于Ruby on Rails框架,为开发者提供了一整套强大的功能,帮助...
总结来说,这个"rails+grape+swagger+devise+capistrano"的简单融合示例展示了一个完整的、功能齐全的API项目架构。Rails作为基础框架,Grape负责API的构建,Swagger用于API的文档化,Devise处理用户认证,而...