Rails Migration Создать первичный ключ таблицы - PullRequest
15 голосов
/ 22 января 2011

Я пишу сценарий миграции для создания таблицы со столбцом первичного ключа с именем 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 нет столбца называется id (это то, что я хочу).Однако проблема в том, что столбец guid представляет собой INT(11) с включенным автоматическим приращением.Поэтому мне нужно выполнить еще одну команду:

change_column :global_feeds, :guid, :string, :limit => 25

Кажется немного сложным, что мне нужно выполнить две команды SQL, чтобы получить то, что, по моему мнению, должно быть возможным в одной.

Любые предложения покак это оптимизировать?

Ответы [ 5 ]

25 голосов
/ 21 апреля 2015

В Rails 4 вы можете сделать;

create_table :global_feeds, id: false do |t|
  t.string :guid, primary_key: true
 ...
end
20 голосов
/ 22 января 2011

Полагаю, вы используете 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, придерживаясь его соглашений.Изменение имени и типа первичного ключа может быть не очень хорошей идеей.

4 голосов
/ 22 января 2011

Вам нужно использовать #column вместо #string. Например:

create_table(:global_feeds, :primary_key => 'guid') do |t|
  t.column :guid, "varchar(25)", :null => false
  ...
end

Обратите внимание, что тип varchar не переносим для баз данных, отличных от MySQL.

3 голосов
/ 16 августа 2011

Это возможно в Rails 3. try:

  def self.up
    create_table(:signups, :id => false) do |t|
      t.string :token, :primary => true

проверьте эту суть для отличного решения для использования UUID в качестве первичного ключа col: https://gist.github.com/937739

1 голос
/ 19 октября 2017

В 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 .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...