今天要做的是这么个东东,先上数据库:
是一个简单的树形结构,一个tree_id对应一个parent_id,相当于对应一个父节点,涉及到了自身的连接关系,其实还是挺复杂的数据库设计,起码当初这个设计是怎么也木有看懂~
想要达到的想法是动态的在节点上增删改,可以用鼠标各种拖动换parent那种。不过现在的本事只能做成静态的,现在的状态是点击某一节点的链接会显示自己,父亲,儿子,以及兄弟。
闲话少说,上代码:
数据库生成部分,很简单的两个属性,注意id:false这句话,这是ruby 1.9之后才支持的特性,其实等同于 :id => false ,也就是说没有在这个表中给规定rails默认的id,那怎么办?请看model部分~
class CreateTreeProviders < ActiveRecord::Migration def change create_table :tree_providers, id: false do |t| t.integer :tree_id t.integer :parent_id t.timestamps end end end
model部分在这里~注意这里面的has_many后面跟复数,belongs_to后面放单数~~而且这两者同样的foreignkey都是parent_id,但是意思却是不一样的。前者是把自己作为主键,parent_id是别人的,后者相反,parent_id是自己的~这是我现在的理解。放了一个验证函数,保证在save之前执行,确保自己不能是自己的parent。
class TreeProvider < ActiveRecord::Base attr_accessible :parent_id, :tree_id has_many :tree_providers , foreign_key: :parent_id belongs_to :tree_provider , foreign_key: :parent_id set_primary_key :tree_id before_save :judge_self def judge_self if parent_id == tree_id false end end end
Controller部分~~只更改了show这一个地方。注意@tree_provider
.tree_provider和
@tree_provider
.tree_providers的区别,其实这样表示很没有区分啦,所以一个现在解决不了的问题来了,
如何才能实现
@tree_provider
.parent 和
@tree_provider
.children?求各路大神帮助ORRRZ
params[
:id
].to_i 这句话的目的是在其父亲的所有儿子中将自己排除掉获得所有兄弟,结果也是各种试出来的,因为发现
params[
:id
]是一个字符串
def show @tree_provider = TreeProvider.find(params[:id]) @children = [] @tree_provider.tree_providers.each{|t|@children<<t.tree_id } @parent = @tree_provider.tree_provider @brothers = [] @parent.tree_providers.each{|t|@brothers<<t.tree_id } @brothers.delete(params[:id].to_i) respond_to do |format| format.html # show.html.erb format.json { render json: @tree_provider } end end
view就太简单啦,只是把@children和@brothers都显示出来而已,鉴于水平太低就不贴代码啦,运行结果是这样的:
上面是所有tree的list,下面是单独的一个节点的信息。
很无聊的东东,聊以自high啦~免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。