Rails Migration Создание основного ключа таблицы
Я пишу перенос script для создания таблицы с столбцом первичного ключа с именем guid
и является VARCHAR(25)
. Проблема в том, что я чувствую, что мне нужно удвоить свои усилия, чтобы достичь того, что должно быть возможно за один шаг.
Если я запустил:
create_table(:global_feeds, :primary_key => 'guid') do |t|
t.string :guid, :limit => 25
t.text :title
t.text :subtitle
...
t.timestamps
end
Я получаю таблицу с первичным ключом под названием guid
no column с именем id
(именно это я и хочу). Однако проблема заключается в столбце guid
- INT(11)
с включенным автоматическим приращением. Поэтому мне нужно запустить еще одну команду:
change_column :global_feeds, :guid, :string, :limit => 25
Кажется немного запутанным, чтобы в основном запускать две команды SQL, чтобы получить то, что, по моему мнению, должно быть возможно в одном.
Любые предложения по оптимизации этого?
Ответы
Ответ 1
Я предполагаю, что вы используете mySQL, вот что вы можете попробовать
create_table :global_feeds, {:id => false} do |t|
t.string :guid
t.text :title
t.text :subtitle
t.timestamps
end
execute "ALTER TABLE global_feeds ADD PRIMARY KEY (guid);"
Если вы не используете mySQL, вы должны изменить запрос в команде execute
для работы с вашим механизмом БД. Я не уверен, что вы можете сделать это на SQLite. И не забудьте поставить эту строку где-нибудь в модели global_feed.rb:
set_primary_key :guid
В любом случае вы получаете максимальную отдачу от Rails, пока придерживаетесь своих соглашений. Изменение имени и типа первичного ключа может быть не очень хорошей идеей.
Ответ 2
В Rails 4 вы можете сделать:
create_table :global_feeds, id: false do |t|
t.string :guid, primary_key: true
...
end
Ответ 3
Вам нужно использовать #column вместо #string. Например:
create_table(:global_feeds, :primary_key => 'guid') do |t|
t.column :guid, "varchar(25)", :null => false
...
end
Обратите внимание, что тип varchar
не переносится в базы данных, отличные от MySQL.
Ответ 4
Это возможно в Rails 3. попробуйте:
def self.up
create_table(:signups, :id => false) do |t|
t.string :token, :primary => true
проверить этот смысл для отличного решения для использования UUID в качестве первичного ключа col: https://gist.github.com/937739
Ответ 5
В Rails 5 для тех, кто получил проблему ArgumentError: Index name '*' on table '*' already exists
, когда rails db:setup
с переходом от @kakoni, для меня работает
create_table(:global_feeds, primary_key: :guid, id: false) do |t|
t.string :guid
...
end
Для получения дополнительной информации, проверьте create_table.