Подтвердить что ты не робот

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, чтобы получить то, что, по моему мнению, должно быть возможно в одном.

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

4b9b3361

Ответ 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.