RailsでConfiguration over Convention

前置き

Convention over ConfigurationがモットーのRuby on Railsですが、ときには逆行したい場合もあります。ここには、そんなユースケースを集めます。

本文

テーブル名

モデルを作ると、モデル名に連動して自動的にモデルクラス名とテーブル名が決まります。

 $ ruby script/generate model item     # クラス名はItem、テーブル名はitemsとなる。
 $ ruby script/generate model my_item  # クラス名はMyItem、テーブル名はmy_itemsとなる。

しかし、運用中DBの既存のテーブルに対応するモデルを作りたい場合などは、任意のテーブル名を使うことができます。例えば、テーブル名がitem_tなら…

  • app/models/item.rb
 class Item < ActiveRecord::Base
   set_table_name 'item_t'
 end

これでOKです。

この場合、DBのマイグレーションファイルは空っぽにしておくのが筋でしょうかね。

  • db/migrate/20100518150428_create_items.rb
class CreateItems < ActiveRecord::Migration
  def self.up
  end

  def self.down
  end
end

外部キー

モデル間の結合を制御するメソッドに、belongs_to、has_one、has_and_belongs_to_many(HABTM)などがあります。それぞれ、参照先モデルのオブジェクトを識別するための列を持ちますが、その列名は自動的に決まります。

class Person < ActiveRecord::Base
  belongs_to :blood_type   # モデル名はBloodType、列名はblood_type_idとなる。
end

しかし、:foreign_keyオプションを使うと、任意の列名に変えることができます(has_oneでもHABTMでも同じ)。

class Person < ActiveRecord::Base
  belongs_to :blood_type, :foreign_key => 'blood_id'
end
Last modified:2011/01/07 22:01:53
Keyword(s):
References:[言語Tips]
This page is frozen.