2013-09-23 3 views
2

Каков правильный способ создания таблицы в рельсах посредством миграции, в которой первичный ключ является строкой вместо int?Rails migration create table w/string основанный первичный ключ

Я попытался установить primary_key, как @oldergod предложил в ответ ниже, но baz кажется, приготовьтесь к int еще:

class CreateFoos < ActiveRecord::Migration 
    def change 
    create_table :foos, primary_key: 'baz' do |t| 
    end 
    end 
end 

UPDATE

Я так пытался

class CreateFoos < ActiveRecord::Migration 
    def change 
    create_table :foos, primary_key: false do |t| 
     t.string :baz 
    end 
    end 
end 

, который меня немного ближе, но все еще отсутствует ПЕРВИЧНЫЙ индекс в столбце. Я попытался add_index :foos, :baz, type: :primary, но это порождает следующую ошибку:

SQLite3::SQLException: near "primary": syntax error: CREATE primary INDEX "index_foos_on_baz" ON "foos" ("baz")/Users/kyledecot/.rvm/gems/ruby-1.9.3-p392/gems/sqlite3-1.3.8/lib/sqlite3/database.rb:91:in `initialize' 

Похоже, это должно работать после того, как смотреть на http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/SchemaStatements.html#method-i-add_index_options

+0

Смотрите этот [ответ] (http://stackoverflow.com/questions/1200568/using-rails-how-can-i-set-my-primary-key-to-not-be -an-integer-typed-column), он содержит подробные сведения о том, как работает генератор и как его обойти. – engineersmnky

+0

Этот ответ имеет побочный эффект 'rake db: schema: load' не работает корректно и создает столбцы' int'. Он будет работать только при использовании 'rake db: migrate'. –

+0

Вы пытаетесь изменить предполагаемое поведение побочных эффектов Rails. Почему вы так заинтересованы в этом? Какой отрицательный эффект имеет целостный первичный ключ? – engineersmnky

ответ

-1

Что отличается, если это строка? См. Документ create table.

create_table :foos, primary_key: 'baz' do |t| 
    t.column :baz, :string 
end 

Also note that this just sets the primary key in the table. You additionally need to configure the primary key in the model via self.primary_key=. Models do NOT auto-detect the primary key from their table definition.

+0

Я обновил свой вопрос с тем, что я пробовал. 'baz' устанавливается на целое число. Это ожидаемое поведение, которое вы можете видеть в документах 'create table', которые вы связали со мной рядом, где говорится:« Переименуйте столбец первичного ключа ». Их сгенерированный вывод - 'guid int (11)' –

+0

@KyleDecot обновил мой ответ. Разве вы не определяете свой столбец внутри блока create_table? – oldergod

+0

Я пробовал то, что дало мне сообщение «вы не можете переопределить первичный столбец« baz ». Чтобы определить настраиваемый первичный ключ, перейдите {id: false} в create_table.' Затем я устанавливаю его в значение false, которое создало столбец, но без индекса. Я обновил свой вопрос с текущим сбоем. –

Смежные вопросы