ActiveRecordでのテーブルマッピング
ActiveRecord::Baseの派生クラスは、クラス名の複数形となるテーブルに対応付けられます。対応するテーブルが見つからない場合、エラーになります。
テーブル定義:
CREATE TABLE kittens ( id int(11) NOT NULL auto_increment PRIMARY KEY, name VARCHAR(255), color VARCHAR(255) );
サンプル:
# kittensテーブルに対応するクラス (テーブル名の単数形) class Kitten < ActiveRecord::Base end kitten = Kitten.find_by_name("mii") puts kitten.name + "/" + kitten.id.to_s # テーブル「foos」が検索され、「対応するテーブルが見つからない」エラーとなる。 class Foo < ActiveRecord::Base end begin kitten = Foo.find_by_name("mii") rescue puts $! end
出力:
mii/1 Mysql::Error: #42S02Table 'test.foos' doesn't exist: SHOW FIELDS FROM foos
テーブル名を明示することもできます。
サンプル:
# テーブル名を明示することも可能。 class Hoge < ActiveRecord::Base set_table_name "kittens" end kitten = Hoge.find_by_name("mii") puts kitten.name + "/" + kitten.id.to_s
出力:
mii/1
継承が深い場合、ActiveRecord::Baseの直下の派生クラス名が使用されます。
サンプル:
# Foo << Kitten << ActiveRecord::Base module A class Kitten < ActiveRecord::Base end class Foo < Kitten end end # A::Foo のAPIを使用 # テーブル「kittens」が検索される kitten = A::Foo.find_by_name("mii") puts kitten.name + "/" + kitten.id.to_s # Kitten << Foo << ActiveRecord::Base module B class Foo < ActiveRecord::Base end class Kitten < Foo end end #テーブル「foos」が検索され、「対応するテーブルが見つからない」エラーとなる。 begin kitten = B::Kitten.find_by_name("mii") rescue puts $! end
出力:
mii/1 Mysql::Error: #42S02Table 'test.foos' doesn't exist: SHOW FIELDS FROM foos