mk-mode BLOG

このブログは自作の自宅サーバに構築した Debian GNU/Linux で運用しています。
PC・サーバ構築等の話題を中心に公開しております。(クローンサイト: GitHub Pages

ブログ開設日2009-01-05
サーバ連続稼働時間
Reading...
Page View 合計
Reading...
今日
Reading...
昨日
Reading...

Ruby on Rails - ActiveRecord で規約外の主キーを使用する方法!

[ プログラミング ] [ Rails, Ruby ]

こんばんは。

Ruby on Rails の ActiveRecord でテーブルを扱う際、デフォルトでは “id” というカラム を使用するようになっています。 Scaffold 機能を使ってジェネレートすると、テーブルに “id” カラムが自動で作成され、更に “id” カラムが主キー(プライマリキー)に割り当てられます。

最初から Scaffold 機能を使用して Ruby on Rails アプリを開発していればよいのですが、元々 Rails 用に開発してなかったデータベースを流用したりする場合には、主キーが “id” カラムでないことの方が多いです。 通常なら、テーブルの主キーは分かりやすく「○○コード」とかを使用したりします。(もちろん “ID” を設定したりすることもありますが)

また、デフォルトでは主キーを2個以上設定する事もできません。("id" カラムを追加して対応する事になったりします)

ちなみに、普段テーブルからレコードを取得するだけなら、"id" 以外を主キーに設定していても問題ありませんが、レコードを update_attributes メソッドでアップデートする際に問題になります。 ※初心者や知らない人はハマります。。。

と言うわけで、今回は “id” カラム以外を主キーに設定する方法の記録です。

対処方法

0. 前提条件

Rails のバージョンは 3.2.3、ActiveRecord のバージョンも 3.2.3 です。

1. 主キーを1つのカラムに設定する場合

“hoge” テーブルの “hoge_code” カラムを主キーに割り当てる場合です。 “RAILS_ROOT/app/models/hoge.rb” に以下のように1行記述を追加するだけです。

1
2
3
class Hoge < ActiveRecord::Base
  self.primary_key = :hoge_code
end

ちなみに、少し古いバージョンなら以下のようになるようです。(当方未確認)

1
2
3
class Hoge < ActiveRecord::Base
  set_primary_keys :hoge_code
end

2. 主キーを複数のカラムに設定する場合

“hoge” テーブルの “hoge_code”, “fuga_code” カラムを主キーに割り当てる場合です。 まず、デフォルトでは複数の主キーは使用できないので、"composite_primary_keys" という複合キーの利用を可能にする Gem ライブラリをインストールします。 ・Gemfile に以下の記述を追加。

1
gem 'composite_primary_keys'

・インストール

1
$ bundle install

そして、"RAILS_ROOT/app/models/hoge.rb" に以下のように1行記述を追加します。

1
2
3
class Hoge < ActiveRecord::Base
  self.primary_keys = :hoge_code, :fuga_code
end

※"primary_key" ではなく、複数形の “primary_keys” です。 ちなみに、少し古いバージョンなら以下のようになるようです。(当方未確認)

1
2
3
class Hoge < ActiveRecord::Base
  set_primary_keys = :hoge_code, :fuga_code
end

これで、"id" 以外のカラムも自由に主キーに設定できます。

以上です。

Comments