今天要做的是這么個(gè)東東,先上數(shù)據(jù)庫:
成都創(chuàng)新互聯(lián)公司網(wǎng)站建設(shè)公司,提供做網(wǎng)站、成都網(wǎng)站建設(shè),網(wǎng)頁設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);可快速的進(jìn)行網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,是專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來合作!是一個(gè)簡(jiǎn)單的樹形結(jié)構(gòu),一個(gè)tree_id對(duì)應(yīng)一個(gè)parent_id,相當(dāng)于對(duì)應(yīng)一個(gè)父節(jié)點(diǎn),涉及到了自身的連接關(guān)系,其實(shí)還是挺復(fù)雜的數(shù)據(jù)庫設(shè)計(jì),起碼當(dāng)初這個(gè)設(shè)計(jì)是怎么也木有看懂~
想要達(dá)到的想法是動(dòng)態(tài)的在節(jié)點(diǎn)上增刪改,可以用鼠標(biāo)各種拖動(dòng)換parent那種。不過現(xiàn)在的本事只能做成靜態(tài)的,現(xiàn)在的狀態(tài)是點(diǎn)擊某一節(jié)點(diǎn)的鏈接會(huì)顯示自己,父親,兒子,以及兄弟。
閑話少說,上代碼:
數(shù)據(jù)庫生成部分,很簡(jiǎn)單的兩個(gè)屬性,注意id:false這句話,這是ruby 1.9之后才支持的特性,其實(shí)等同于 :id => false ,也就是說沒有在這個(gè)表中給規(guī)定rails默認(rèn)的id,那怎么辦?請(qǐng)看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后面跟復(fù)數(shù),belongs_to后面放單數(shù)~~而且這兩者同樣的foreignkey都是parent_id,但是意思卻是不一樣的。前者是把自己作為主鍵,parent_id是別人的,后者相反,parent_id是自己的~這是我現(xiàn)在的理解。放了一個(gè)驗(yàn)證函數(shù),保證在save之前執(zhí)行,確保自己不能是自己的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這一個(gè)地方。注意@tree_provider
.tree_provider和
@tree_provider
.tree_providers的區(qū)別,其實(shí)這樣表示很沒有區(qū)分啦,所以一個(gè)現(xiàn)在解決不了的問題來了,
如何才能實(shí)現(xiàn)
@tree_provider
.parent 和
@tree_provider
.children?求各路大神幫助ORRRZ
params[
:id
].to_i 這句話的目的是在其父親的所有兒子中將自己排除掉獲得所有兄弟,結(jié)果也是各種試出來的,因?yàn)榘l(fā)現(xiàn)
params[
:id
]是一個(gè)字符串
def show @tree_provider = TreeProvider.find(params[:id]) @children = [] @tree_provider.tree_providers.each{|t|@children<view就太簡(jiǎn)單啦,只是把@children和@brothers都顯示出來而已,鑒于水平太低就不貼代碼啦,運(yùn)行結(jié)果是這樣的:
上面是所有tree的list,下面是單獨(dú)的一個(gè)節(jié)點(diǎn)的信息。
很無聊的東東,聊以自high啦~創(chuàng)新互聯(lián)www.cdcxhl.cn,專業(yè)提供香港、美國(guó)云服務(wù)器,動(dòng)態(tài)BGP最優(yōu)骨干路由自動(dòng)選擇,持續(xù)穩(wěn)定高效的網(wǎng)絡(luò)助力業(yè)務(wù)部署。公司持有工信部辦法的idc、isp許可證, 機(jī)房獨(dú)有T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確進(jìn)行流量調(diào)度,確保服務(wù)器高可用性。佳節(jié)活動(dòng)現(xiàn)已開啟,新人活動(dòng)云服務(wù)器買多久送多久。
網(wǎng)站名稱:rails入門級(jí)開發(fā)項(xiàng)目——樹形分類(1)-創(chuàng)新互聯(lián)
轉(zhuǎn)載來源:http://weahome.cn/article/ioeod.html