[解決済み] Railsで、主キーが整数型でないカラムを設定するには?
質問
Railsのmigrationsを使ってデータベーススキーマを管理しているのですが、主キーとして非整数の値(特に文字列)を使いたい簡単なテーブルを作成しています。私の問題から抽象化するために、例えばテーブル
employees
というテーブルがあり、従業員は英数字の文字列で識別されているとします。
"134SNW"
.
こんな感じでマイグレーションでテーブルを作成してみました。
create_table :employees, {:primary_key => :emp_id} do |t|
t.string :emp_id
t.string :first_name
t.string :last_name
end
この結果、完全に無視されたように見えるのが
t.string :emp_id
の行を完全に無視し、先に進んでそれを整数カラムにしたようなものです。PRIMARY_KEY制約(PostgreSQLを使用しています)をrailsに生成させる他の方法はないでしょうか。
execute
の呼び出しでSQLを書く必要はありません。
ノート : 私は文字列カラムを主キーとして使用するのが最善ではないことを知っています。私はいずれにせよ1つを追加するかもしれませんが、この質問はまだ有効です。
どのように解決するのですか?
残念ながら、私が判断したところでは
execute
.
動作しない理由
ActiveRecordのソースを調べてみると、以下のようなコードがあります。
create_table
:
def create_table(table_name, options={})
...
table_definition.primary_key(options[:primary_key] || Base.get_primary_key(table_name.to_s.singularize)) unless options[:id] == false
...
end
ということで、主キーを指定しようとすると
create_table
オプションで指定すると、その指定された名前の主キーを作成します(何も指定されていない場合は
id
). これは、テーブル定義ブロックの内部で使用できるのと同じメソッドを呼び出すことで行います。
primary_key
.
def primary_key(name)
column(name, :primary_key)
end
これは単に指定された名前のカラムを作成するもので、型は
:primary_key
. これは、標準のデータベースアダプタでは以下のように設定されています。
PostgreSQL: "serial primary key"
MySQL: "int(11) DEFAULT NULL auto_increment PRIMARY KEY"
SQLite: "INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL"
回避策
主キーの型としてこれらを使用することになるため、私たちは
execute
を使用して整数でない主キーを作成しなければなりません(PostgreSQLの
serial
はシーケンスを使用した整数です)。
create_table :employees, {:id => false} do |t|
t.string :emp_id
t.string :first_name
t.string :last_name
end
execute "ALTER TABLE employees ADD PRIMARY KEY (emp_id);"
そして
ショーン・マクレアリー氏が言及
を使用して主キーを設定する必要があります。
set_primary_key
:
class Employee < ActiveRecord::Base
set_primary_key :emp_id
...
end
関連
-
[解決済み】TypeError: SymbolからIntegerへの暗黙の変換がない。
-
[解決済み] gemのインストールができない - gemネイティブ拡張の構築に失敗 - そのようなファイルをロードできない -- mkmf (LoadError)
-
[解決済み] Railsマイグレーションを利用してカラムをドロップする方法
-
[解決済み] Rubyのクラスで未初期化の定数エラーが発生する
-
[解決済み] Oauth2 Instagram API "リダイレクトURIが登録されたリダイレクトURIと一致しない"
-
[解決済み] gemのアップデート後、"Asset was not declared to be precompiled in production "でテストが失敗する。
-
[解決済み] Ruby on Railsのマイグレーションでデータベースのカラムの名前を変更するにはどうすればよいですか?
-
[解決済み] MySQLで'insert if not exists'を行うにはどうしたらいいですか?
-
[解決済み] postgres の主キー配列が同期しなくなったときにリセットする方法は?
-
[解決済み】Railsでuser_id:integerとuser:referencesを使用してモデルを生成する。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Bundler: コマンドが見つからない
-
[解決済み】取得中。「プロジェクトのクローンとマイグレート後に、「マイグレーションは保留中です。この問題を解決するには 'bin/rake db:migrate RAILS_ENV=development' を実行してください。
-
[解決済み] Ruby/Rails の「フック」とは何ですか?
-
[解決済み] Railsで `before_action` での `only:` はどのように機能するのですか?
-
[解決済み] railsでhidden fieldタグを使用する方法
-
[解決済み] RoRにおけるSpringサーバーの機能とは?
-
[解決済み] Rspec が私のモデルクラスを認識しない。初期化されていない定数エラー
-
[解決済み] Heroku: 既存のrailsアプリにseeds.rbをプッシュする方法?
-
[解決済み] Railsでグループとカウント
-
[解決済み] 属性とカラムの違いは何ですか?