7

postgresql 9.3、Ruby 2.0、Rails 4.0.0 を使用しています。

テーブルに主キーを設定することに関する SO に関する多くの質問を読んだ後、次の移行を生成して追加しました。

class CreateShareholders < ActiveRecord::Migration
  def change
    create_table :shareholders, { id: false, primary_key: :uid  } do |t|
      t.integer :uid, limit: 8
      t.string :name
      t.integer :shares

      t.timestamps
    end
  end
end

self.primary_key = "uid"私も自分のモデルに追加しました。

移行は正常に実行されますが、pgAdmin III を使用して DB に接続すると、uid 列が主キーとして設定されていないことがわかります。私は何が欠けていますか?

4

3 に答える 3

18

この回答を見てください。execute "ALTER TABLE shareholders ADD PRIMARY KEY (uid);"create_table ブロックで primary_key パラメータを指定せずに試してください。

移行を次のように記述することをお勧めします (通常どおりにロールバックできるようにします)。

class CreateShareholders < ActiveRecord::Migration
  def up
    create_table :shareholders, id: false do |t|
      t.integer :uid, limit: 8
      t.string :name
      t.integer :shares

      t.timestamps
    end
    execute "ALTER TABLE shareholders ADD PRIMARY KEY (uid);"
  end

  def down
    drop_table :shareholders
  end
end

UPD:自然な方法があります(ここにあります)が、int4タイプのみ:

class CreateShareholders < ActiveRecord::Migration
  def change
    create_table :shareholders, id: false do |t|
      t.primary_key :uid
      t.string :name
      t.integer :shares

      t.timestamps
    end    
  end
end
于 2013-09-27T14:39:19.800 に答える
1

私の環境(activerecord 3.2.19とpostgres 9.3.1)では、

:id => true, :primary_key => "columname"

主キーを正常に作成しますが、「:limit => 8」を指定する代わりに、列の型は int4 です!

create_table :m_check_pattern, :primary_key => "checkpatternid" do |t|
  t.integer     :checkpatternid, :limit => 8, :null => false
end

不完全な情報で申し訳ありません。

于 2014-07-09T03:03:57.130 に答える
0

次のような移行を作成しました。

class CreateShareholders < ActiveRecord::Migration
  def change
    create_table :shareholders, id: false do |t|
      t.integer :uid, primary_key: true
      t.string :name
      t.integer :shares

      t.timestamps
    end    
  end
end
于 2016-05-30T10:21:06.987 に答える