9

Rails 3 で型付きの主キー フィールドbigint(またはstringそうでないもの)を作成したいと思います。int

たとえば、次のような特定のデータ構造があります。

things
------
id bigint primary_key
name char(32)

私が現在プッシュしようとしているアプローチ:

create_table :things, :id => false do |t| # That prevents the creation of (id int) PK
  t.integer :id, :limit => 8 # That makes the column type bigint
  t.string :name, :limit => 32
  t.primary_key :id # This is perfectly ignored :-(
end

列の型は正しくなりますが、主キー オプションは sqlite3 には存在しません。これは MySQL にも当てはまると思います。

4

6 に答える 6

5

私も同じ問題を抱えていました。私はテーブルのための最も簡単な方法だと思います

accounts 
id bigint primary key 
name char 

create_table :accounts do |t|
t.string :name
end
change_column :accounts, :id , "bigint NOT NULL AUTO_INCREMENT"
于 2012-09-20T14:27:21.650 に答える
3

それは少し前のことで、ここで答えを見つけました。Railsを使用して、主キーを整数型の列ではないように設定するにはどうすればよいですか。

移行を実行する前に、primary_key:falseを設定してから、カスタムステートメントを使用する必要があります。

編集1:実行する正確なクエリについては、データベースのドキュメントを確認する必要があります。これは通常のSQLステートメントとして実行され、データベース固有である必要があります。私が言及した質問の例は、PostgreSQLの例です。MySQLを使用している場合は、それを変更する必要があるかもしれません。

于 2011-05-04T08:38:46.230 に答える
3

MySQL の場合、「BIGINT UNSIGNED NOT NULL AUTO_INCREMENT」のエイリアスである「SERIAL」を使用できます。

class ChangeUserIdToBigint < ActiveRecord::Migration
  def change
    change_column :users, :id, 'SERIAL'
  end
end
于 2013-09-30T17:40:33.783 に答える
0

skalogirou さんの回答は良いのですが、変更が schema.rb に反映されません。したがって、タスクは同じようなDB 構造を作成db:schema:loaddb:test:cloneません。

必要な回避策は、httpdb:schema:load ://www.lshift.net/blog/2013/09/30/ching-the-primary-key-type-in​​-ruby- で説明されているように、rake タスクを拡張して db:test:clone することです 。 on-rails-models/

これは、その回避策に基づいて使用したものです。

namespace :my_app do
  namespace :db do
    task :after_schema_load_and_db_test_clone => :environment do
    puts 'Changing primary key for :my_table'
    query = 'ALTER TABLE <my_table> CHANGE id id bigint DEFAULT NULL auto_increment'
    ActiveRecord::Base.connection.execute(query)
  end
end


Rake::Task['db:schema:load'].enhance do
  ::Rake::Task['my_app:db:after_schema_load_and_db_test_clone'].invoke
end

Rake::Task['db:test:clone'].enhance do
  ::Rake::Task['my_app:db:after_schema_load_and_db_test_clone'].invoke
end
于 2015-01-08T13:51:11.897 に答える