2011/06/02

ActiveRecordで木構造を扱うめも

1:nの自己参照 = 木構造のデータをRailsで扱いたい

具体的には、SetucoCMSのCategoriesテーブル。ERDは↓こんなの
https://spreadsheets.google.com/spreadsheet/pub?hl=ja&hl=ja&key=0AsZ5eShbQ7T_dDJRRm5pdkJUUDlHQUVobnhPckFnWWc&output=html

外部キーの名前も、デフォルトの
_idじゃなくてparent_idにしたい。

migrationの定義

こうした。

  1 class CreateCategories < ActiveRecord::Migration
  2   def self.up     
  3     create_table :categories do |t|
  4       t.string :name, :null => false
  5       t.integer :parent_id
  6       t.timestamps                                                                                                      
  7     end           
  8   end             
  9                   
 10   def self.down   
 11     drop_table :categories
 12   end             
 13 end  

Categoryモデルの定義


こうした。

  1 # -*- coding:UTF-8 -*-                                   
  2 class Category < ActiveRecord::Base                      
  3   has_many :pages                                        
  4                                                          
  5   has_many :children, :class_name => 'Category', :foreign_key => :parent_id                                             
  6   belongs_to :parent, :class_name => 'Category', :foreign_key => :parent_id
  7                                                          
  8 end    

試す(`・ω・´)

~/programming/ruby/SetucoCMSR$ rails c
Loading development environment (Rails 3.0.7)
ruby-1.9.2-p180 :001 > Category.all
 => [] 
ruby-1.9.2-p180 :002 > c = Category.create([
ruby-1.9.2-p180 :003 >       {:name => 'cat1'},
ruby-1.9.2-p180 :004 >       {:name => 'cat2', :parent_id => 1},
ruby-1.9.2-p180 :005 >       {:name => 'cat3', :parent_id => 1},
ruby-1.9.2-p180 :006 >       {:name => 'cat4', :parent_id => 2}
ruby-1.9.2-p180 :007?>     ])
 => (snip)
ruby-1.9.2-p180 :008 > pp c
[#<Category id: 1, name: "cat1", parent_id: nil, created_at: "2011-06-02 10:56:44", updated_at: "2011-06-02 10:56:44">,
 #<Category id: 2, name: "cat2", parent_id: 1, created_at: "2011-06-02 10:56:44", updated_at: "2011-06-02 10:56:44">,
 #<Category id: 3, name: "cat3", parent_id: 1, created_at: "2011-06-02 10:56:44", updated_at: "2011-06-02 10:56:44">,
 #<Category id: 4, name: "cat4", parent_id: 2, created_at: "2011-06-02 10:56:44", updated_at: "2011-06-02 10:56:44">]
 => (snip)
ruby-1.9.2-p180 :009 > pp c[0].children
[#<Category id: 2, name: "cat2", parent_id: 1, created_at: "2011-06-02 10:56:44", updated_at: "2011-06-02 10:56:44">,
 #<Category id: 3, name: "cat3", parent_id: 1, created_at: "2011-06-02 10:56:44", updated_at: "2011-06-02 10:56:44">]
 => (snip)
ruby-1.9.2-p180 :010 > pp c[1].parent
#<Category id: 1, name: "cat1", parent_id: nil, created_at: "2011-06-02 10:56:44", updated_at: "2011-06-02 10:56:44">
 => (snip)
ruby-1.9.2-p180 :011 > pp c[1].children
[#<Category id: 4, name: "cat4", parent_id: 2, created_at: "2011-06-02 10:56:44", updated_at: "2011-06-02 10:56:44">]
 => (snip)

でけた!

コメントを投稿

 
Design by Free WordPress Themes | Bloggerized by Lasantha - Premium Blogger Themes | cna certification