Rails でのリレーション設定

外部キー参照でグダグダ悩んでたんだけど,
とりあえず 1:1, 1:n は理解できた.

1:1 対応の場合

例えば users テーブルと accounts テーブルで 1:1 対応する場合.

  • users テーブルのモデル名は User
  • accounts テーブルのモデル名は Account
    • accounts テーブルに user_id を integer で作成しておく.

Migration スクリプトとしては

def self.up
  add_column(:accounts, :user_id, :intger)
end

def self.down
  remove_column(:accounts, :user_id)
end

とか? でもって app/models/{user, account}.rb でもって

# app/models/user.rb
class User < ActiveRecord::Base
  has_one(:account)
end

# app/models/account.rb
class Account < ActiveRecord::Base
  belongs_to(:user)
end

ってするだけ.

  • accounts テーブルで users にマッピングしている.
    • Account クラスでは belongs_to(:user) に.

その一方で,

  • User クラスでは has_one(:account) になる.

単数, 複数に注意すべし. <-この辺が Rails だわ.

1:n の場合

今, 手慰みに作成している論文データベースでは,
papers テーブルと journals テーブルに 1:n 対応をつけている.

この場合 papers に journal_id を作成しておいて(Migration でいける,SQL 文はとりあえずいらない), モデルを弄る.

# app/models/paper.rb
class User < ActiveRecord::Base
  belongs_to(:journal)
end

# app/models/journal.rb
class Account < ActiveRecord::Base
  has_many(:papers)
end

みたいに. has_many(:papers) ってのが肝かな.

…さて, 一応 m:n 対応の場合には has_and_belongs_to_many な訳ですが.
これでもって Paper と Author に対応させれば良いんでしょうけど.

明日やろう.