読者です 読者をやめる 読者になる 読者になる

単一テーブル継承

今日は単一テーブル継承を使ってみました。
単一テーブル継承は、属性がある程度共通する継承関係にあるエンティティを、一つのテーブルで管理する機能?です。継承関係をテーブルにマッピングするというのはHibernateとかでもやりますが、Railsではかなり簡単にできるのが面白いですね。やるべきことは、テーブルにtypeという文字列型の列を定義しておくことくらいです。あとは、モデルクラスで

class Person < ActiveRecord::Base
end

class Manager < Person
end

class Employee < Person

のようにしておけば、ActiveRecordさんの方でやってくれます。Managerのみが持つ属性にもEmployeeからアクセスできてしまったりはしますが、モデル自体に定義はないのであまり気にならないですね。こうしておいて

  Manager.create(:name => 'Ken')
  Employee.create(:name => 'Ichiro')

みたいにすると、typeにそれぞれ'Manager','Employee'というクラス名が自動で設定されます。データの取得の際にも

  Manager.find(:all)  # => Managerのみ取得
  Employee.find(:all) # => Employeeのみ取得
  Person.find(:all)   # => 両方取得

という様になります。

ただ、Controllerクラスを使い回そうとすると以下のようなエラーになってしまいました。具体的にはManagerが登録された状態でPeopleControlelr#indexを実行したのですが、

undefined method `manager_path' for #
/usr/local/lib/ruby/gems/1.8/gems/actionpack-2.1.0/lib/action_controller/polymorphic_routes.rb:101:in `send!'
/usr/local/lib/ruby/gems/1.8/gems/actionpack-2.1.0/lib/action_controller/polymorphic_routes.rb:101:in `polymorphic_url'
/usr/local/lib/ruby/gems/1.8/gems/actionpack-2.1.0/lib/action_controller/polymorphic_routes.rb:108:in `polymorphic_path'
/usr/local/lib/ruby/gems/1.8/gems/actionpack-2.1.0/lib/action_view/helpers/url_helper.rb:79:in `url_for'
/usr/local/lib/ruby/gems/1.8/gems/actionpack-2.1.0/lib/action_view/helpers/url_helper.rb:199:in `link_to'

url_helperのurl_forのところで、Managerに対応したパスを取得しようとしてエラーが出ているようです。redirect_toとかも同じです。単一テーブル継承の使い方としておかしいのだろうか??