2014年1月19日日曜日

Ancestry

親子構造を格納するモデルを用意しようとしてたら、AncestryというGemを見つけた

準備

適当にrailsプロジェクトを作成し、Gemfileにgem 'ancestry'を記述しbundle install


scaffoldを作る

$ rails  g scaffold tenant name:string


Tenantモデルを編集

# app/models/tenant.rb
class Tenant < ActiveRecord::Base
  attr_accessible :name, :parent_id
  attr_accessible :name # 2014/1/21 parent_idは不要でした
  has_ancestry
end


フォーム編集用ビューを編集

# app/views/tenants/_form.html.erb
<div class="field">
  <%= f.label :parent %><br />
  <%= f.select :parent_id, options_from_collection_for_select(Tenant.all, :id, :name) %>
</div>


Tenantモデルへancestryカラムを追加してマイグレーション

# rails g migration add_ancestry_to_tenants ancestry:string
class AddAncestryToTenants < ActiveRecord::Migration
  def change
    add_column :tenants, :ancestry, :string, after: :id
    add_index :tenants, :ancestry
  end
end


indexビューを編集(抜粋)

# app/views/tenants/index.html.erb
    <td><%= tenant.parent ? tenant.parent.name : nil %></td>
    <td><%= tenant.ancestors.map &:name %></td>
    <td><%= tenant.children.map &:name %></td>
    <td><%= tenant.descendants.map &:name %></td>

この状態でモデルの作成を繰り返すと、indexの表示はたとえば次のようになる

この時、tenantsテーブルの中身は次のようになる







0 件のコメント:

コメントを投稿