複合キーの使い方

複合キーのプラグインを使って,当面のモデル化は大体大丈夫そうです。作業メモとして手順と設定を書いておきます。

プラグインのインストールは
gem install composite_primary_keys

で行います。

environment.rbには
require 'rubygems'
require 'composite_primary_keys'

と書いておきます。

まず,Team回りの設定から。Teamクラスには下のように二つのbelongs_toを設定。
class Team < ActiveRecord::Base
  set_primary_keys :tmember, :tblog
  set_base_name :team
  belongs_to :blog, :foreign_key => 'tblog'
  belongs_to :member, :foreign_key => 'tmember'
end

Blogクラスには以下の2行を追加
  has_many :teams, :class_name=>'Team' ,:foreign_key => 'tblog'
  has_many :members, :class_name=>'Member' ,:through=>:teams

同様にMemberクラスにも
  has_many :teams, :class_name=>'Team' ,:foreign_key => 'tmember'
  has_many :blogs, :class_name=>'Blog' ,:through=>:teams
を追加しました。これでmember.blogsとか,blog.membersといった形で参照できるようになります。

次に,もうちょっと単純ですが,スキン関係とテンプレート関係を設定。nucleus_skin_descテーブルにはスキンのIDと名前,説明が,nucleus_skinテーブルには各パートがスキンのIDとパート名をキーとして入っています。

skin_descの方をSkinモデルにします。
class Skin < ActiveRecord::Base
  set_base_name :skin_desc
  set_primary_key :sdnumber
  has_many :parts, :class_name=>'SkinPart' ,:foreign_key => 'sdesc'
end

skinテーブルをSkinPartモデルにします。
class SkinPart < ActiveRecord::Base
  set_base_name :skin
  set_primary_keys :sdesc, :stype
  belongs_to :skin, :foreign_key => :sdesc
end

使い方はこんな感じ。
「default」スキンを獲得
>> skin = Skin.find_by_sdname('default')
skin = Skin.find_by_sdname('default')
=> #"text/html", "sdnumber"=>"5", "sdincmode"=>"skindir", "sddesc"=>"Nucleus CMS default skin", "sdincpref"=>"default/", "sdname"=>"default"}>

このスキンの「index」パートを獲得
>> indexpart = skin.parts.find_by_stype('index')
indexpart = skin.skin_parts.find_by_stype('index')
=> #
以下略

SkinのIDが分かっているならば直接パートの内容を得ることもできます。
>> indexpart = SkinPart.find([5, 'index'])
indexpart = SkinPart.find([5, 'index'])
=> #
以下略

実際のパートの内容にはindexpart.scontentでアクセスできます。テンプレートも同様です。

追記:
  def part(type)
    SkinPart.find([self.id, type]).scontent
  end

とSkinクラスに追加するとskin.part('index')とかで簡単にパートの内容にアクセスできます。多分この方が楽だし速い。


31 Oct, 2007 | General | | Andy
« Prev item - Next Item »
---------------------------------------------

Comments


No comments yet. You can be the first!


Leave comment

© 2007 yoursite.com | Designed by DesignsByDarren
Ported to Nucleus CMS: Suvoroff