soraなりの日々 - fc2 -

こころにひっかかったもの

[ruby, rails] :polymorphic について理解する

今回は、あるデータに2つのテーブルのデータを
紐付けする時とかに便利な :polymorphic について理解する。

前回書いた has_many :throught に関しては、こちら。

[[ruby, rails]今更だが、has_many :through(多対多)をまとめてみよーか]
http://sora2hs.blog70.fc2.com/blog-entry-394.html


このエントリーをはてなブックマークに追加
データの説明を簡略化するため、
今回、エレキギターで説明してみる。
(その説明すら、サクッとだけにします。
 深いつっこみはやめてね(^^)

エレキギターには、弦の音を拾うために
ピックアップというものがついてる。

そのピックアップにはおおまかにシングル
コイルのものと、シングルコイルが2つ重なった
ハムバッカーのものがある。

当然、シングル、ハムバッカー、それぞれ
製造するメーカーもあり、型もさまざま。

エレキギター、シングルコイルのピックアップ、
ハムバッカーのピックアップのそれぞれをモデルに
落としてみる。

[ギター]
guitar
(※ 因みに hamer ギターがオイラ大好き)

[シングルコイル]
singles

[ハムバッカー]
humbuckers
(※ 因みに duncan が大好き)

で、ギターと各ピックアップの紐付けを行うため、
guitar_pu なるテーブルを作成する。

[ギターピックアップ]
pu

そして、各モデルに polymorphic の設定をする。

[models/guitar.rb]
class Guitar < ActiveRecord::Base
  has_many :guitar_pus
end


[models/single.rb]
class Single < ActiveRecord::Base
  has_many :guitar_pus, :as => :pu
end


[models/humbucker.rb]
class Humbucker < ActiveRecord::Base
  has_many :guitar_pus, :as => :pu
end


[models/guitar_pu.rb]
class GuitarPu < ActiveRecord::Base
  belongs_to :guitar
  belongs_to :pu, :polymorphic => true
end



で、実際に紐付けを行ってみる。
script/console を立ち上げて、、、


[フェンダーにシングル pu を紐付け]
>> g = Guitar.find(3)
=> #<Guitar id: 3, name: "fender", created_at: "2008-12-13 17:48:31", updated_at: "2008-12-13 17:48:31">
>> s = Single.find(3)
=> #<Single id: 3, name: "FENDER CUSTOM'54 STRAT SET", created_at: "2008-12-13 17:52:42", updated_at: "2008-12-13 17:52:42">
>> pu = GuitarPu.new
>> pu.pu = s
>> g.guitar_pus << pu
>> pu = GuitarPu.new
>> pu.pu = s
>> g.guitar_pus << pu
>> pu = GuitarPu.new
>> pu.pu = s
>> g.guitar_pus << pu
>> g.guitar_pus.each {|o| pu = o.pu; p pu.name; }
"FENDER CUSTOM'54 STRAT SET"
"FENDER CUSTOM'54 STRAT SET"
"FENDER CUSTOM'54 STRAT SET"

# ストラトを想定して、fender にシングルコイルを3つ追加してみる


[ギブソンにハムバッカー pu を紐付け]
>> g = Guitar.find(2)
=> #<Guitar id: 2, name: "gibson", created_at: "2008-12-13 17:48:20", updated_at: "2008-12-13 17:48:20">
>> h = Humbucker.find(2)
=> #<Humbucker id: 2, name: "SEYMOUR DUNCAN SH-6n Black", created_at: "2008-12-13 17:56:25", updated_at: "2008-12-13 17:56:25">
>> pu = GuitarPu.new
>> pu.pu = h
>> g.guitar_pus << pu
>> pu = GuitarPu.new
>> pu.pu = h
>> g.guitar_pus << pu
>> g.guitar_pus.each {|o| pu = o.pu; p pu.name; }
"SEYMOUR DUNCAN SH-6n Black"
"SEYMOUR DUNCAN SH-6n Black"

# レスポールを想定して、gibson にハムバッカーを2つ追加してみる


[ヘイマーにはシングル pu 、ハムバッカー pu を紐付け]
(そんなん嫌いだけど、、、)
>> g = Guitar.find(1)
=> #<Guitar id: 1, name: "hamer", created_at: "2008-12-13 17:48:07", updated_at: "2008-12-13 17:48:07">
>> s = Single.find(1)
=> #<Single id: 1, name: "DIMARZIO DP415 WHITE", created_at: "2008-12-13 17:51:58", updated_at: "2008-12-13 17:51:58">
>> h = Humbucker.find(2)
=> #<Humbucker id: 2, name: "SEYMOUR DUNCAN SH-6n Black", created_at: "2008-12-13 17:56:25", updated_at: "2008-12-13 17:56:25">
>> pu = GuitarPu.new
>> pu.pu = s
>> g.guitar_pus << pu
>> pu = GuitarPu.new
>> pu.pu = h
>> g.guitar_pus << pu
>> g.guitar_pus.each {|o| pu = o.pu; p pu.name; }
"DIMARZIO DP415 WHITE"
"SEYMOUR DUNCAN SH-6n Black"

# 参照するのは別テーブルなのにきちんと表示される



で、ちゃんと追加されているっと。

guitar_pus02

いやー、便利ですよ。コレ!!


で、全然関係ないですが、、、
ちょ、フレッド。
ギターがあまりにもひどすぎやってっっ!!(^^;




ほんとはかっこ良いんだけどなー。
これは酷すぎる・・・orz
http://jp.youtube.com/watch?v=zMuWTi4Nldc&feature=related


[the top 7 worst guitar solos of all time]
http://www.spike.com/blog/top-7-worst-guitar/71484
このエントリーをはてなブックマークに追加

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバックURLはこちら
http://sora2hs.blog70.fc2.com/tb.php/418-6d4b5c2a
この記事にトラックバックする(FC2ブログユーザー)