Rails2.1 の STI
ruby>>
class Parts < ActiveRecord::Base # STI
end
class Parts::Image < Parts
end
part = Parts::Image.create!
p part[:type]
<<ruby
で何が返るのかの話。
before 2.1
ruby>>
part[:type] # => "Image"
<<ruby
after 2.1
ruby>>
part[:type] # => "Parts::Image"
<<ruby
互換性
2.1 では AR::Base.sti_name メソッドが返す値を利用しており、
AR::Base.store_full_sti_class で制御できる。
ruby>>
Parts::Image.store_full_sti_class # => true
Parts::Image.sti_name # => "Parts::Image"
Parts::Image.create[:type] # => "Parts::Image"
Parts::Image.store_full_sti_class = false
Parts::Image.sti_name # => "Image"
Parts::Image.create[:type] # => "Image"
<<ruby
応用
2.1 のSTIを利用するとナベアツな世界を簡単に作成できる。
ruby>>
class Person < ActiveRecord::Base; end
class Nabe < Person; end
class Aho < Person; end
def Person.sti_name
Time.now.day % 3 == 0 ? "Aho" : "Nabe"
end
(1..3).map{ Nabe.create[:type] }
=> ["Nabe", "Nabe", "Nabe"]
Stub
class Time
def day
3
end
end
(1..3).map{ Nabe.create[:type] }
=> ["Aho", "Aho", "Aho"]
<<ruby