OraRails

Oracle(9i,10g)+RubyOnRails(Ver1.2.1+Apache+mongrel)の設定メモ

foreign_key has_many belongs_to

2008-01-04 15:39:52 | 全般
自分の触っているDBはRails仕様ではないので、ORマッピングには、ActiveRecordのオーバーライドが必要になる。
規約外のSave

has_many belongs_to は、検索

それでもよくわからない人は
HowToUseLegacySchemas を見よう。

以下のくだりが全てだ。
-----------------------------------------------------
関連について悩む前に、基本的な部分を少し先に考えよう。 Railsはまず初めにどうやってデータを見つけるか知っておく必要がある。なので、テーブル名と主キーを教えてやらないといけない。これはActiveRecord::Base.table_name() と primary_key メソッドをオーバーライドすることで実現できる:

class Office <ActiveRecord::Base set_primary_key "o_ID"
end
...とこんな感じに、他の4つのクラスについても設定する。

ここまで来ると、関連について考え始められる。

ここでの関連には以下のようなものがある:

officeはcityに属している (office belongs to city)
personは複数のofficeを持つ (person has many offices)
officeは複数のpeopleを持つ (office has many people)
personは複数のbookを持つ (person has many books)
bookは複数のpeopleを持つ (book has many people)
Here's how it works in Rails. 基本的なモデル、Person, Office, City, Bookはの4つだ。 PersonはOfficeを複数持つと共にそれに属し(has_and_belongs_to_many)、またBookをも同様に複数持つと共にそれに属す(has_and_belongs_to_many)。 OfficeはCityに属し(belongs_to)、CityはOfficeを複数持つ(has_many)。まず一番簡単なものからやろう。 OfficeがCityに属すことを示すには、office.rbの最初に次を記述する:

belongs_to :city, :foreign_key=> "city_id"
:foreign_key を指定するとActiveReocrdはcity_idフィールドをofficeテーブルから探すようになる。たまたまこのフィールドはActiveRecordが期待する値と同じだったので、今回は必要ないけど。逆向きの関連はcity.rbファイルの頭に次を追加する:

has_many :offices, :foreign_key => 'city_id'
has_many関連なので、ここでは:foreign_key指定でActiveRecordにofficeテーブルを見に行くように指示している。
-----------------------------------------------------------------

なお、結合したデータをfind するときに
:include => '連結先モデル'
でよぶことができる

を参照。