поле id без опции автоинкремента в миграции - PullRequest
8 голосов
/ 05 февраля 2009

У меня миграция БД выглядит так:

 class CreateParticipations < ActiveRecord::Migration
      def self.up
        create_table(:participations, :primary_key => 'Seat')  do |t|      
          t.integer :Seat
          t.string :Nickname
          t.string :Clan
          t.string :FirstName
          t.string :LastName
          t.string :Email
          t.boolean  :Payed

          t.timestamps
        end
      end

      def self.down
        drop_table :participations
      end
    end

Теперь место создается с автоматическим приращением. Однако я этого не хочу. Я хочу это без автоинкремента. Я сам определю место в моей логике.

Я искал вокруг, но не могу найти, как отключить auto_increment.

Как мне это сделать? За исключением того, чтобы делать это вручную в MySQL.

Ответы [ 4 ]

17 голосов
/ 09 июня 2009

Для справки: если вам абсолютно необходимо это сделать (это не должно часто случаться), вот способ сделать первичный ключ без автоинкрементации с помощью DSL миграции Rails:

create_table(:table_name, :id => false) do |t|
  t.integer :id, :options => 'PRIMARY KEY'
end

Это все равно будет работать для MySQL, если ваша БД использует другой синтаксис для указания первичного ключа, замените :options => 'PRIMARY KEY' на то, что есть.

2 голосов
/ 09 июля 2012

Этому вопросу уже 3 года, но если кому-то интересно, через 3 года, как и мне, все, что вам нужно, это "change_column" в случае, если таблица уже создана:

change_column(:table_name, :id, :integer, :null => false)

Это должно работать в Rails 2.x и 3.x.

O

0 голосов
/ 16 апреля 2013

Не говорю, что это хорошая идея, но вот как я это сделал для SQLite3 - просто замените этот SQLiteAdapter на адаптер вашей БД - вы можете сделать это более чистым / коротким с вызовом define_method

class AbstractAdapter
end

module ActiveRecord
  module ConnectionAdapters
    class SQLiteAdapter < AbstractAdapter
      def supports_autoincrement?
        false
      end
    end
  end
end

<then you migration>

или

class SomeMigration < ActiveRecord::Migration
  def change
    create_table :table do |t|
      ActiveRecord::ConnectionAdapters::SQLiteAdapter.send :define_method, :supports_autoincrement? do false end
      t.integer etc
    end
  end
end

Конечно, просто поменяйте адаптер на другие БД

0 голосов
/ 06 февраля 2009

Есть ли причина, по которой вы не можете использовать ключ идентификатора rails и вручную добавить индекс под названием Seat?

Я видел некоторые хаки только для того, чтобы получить рельсы для -work- в базах данных non-increment-pk. Я не думаю, что это вариант. Насколько я помню, именно так rails получает доступ ко всем функциям для каждой строки.

Честно говоря, как, безусловно, нужно ли это небольшое повышение эффективности игнорирования структуры рельсов?

Я думаю, что на самом деле ответ "ты не можешь". У Activerecord есть несколько вещей, на которые он не сгибается.

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