Изменить начальный номер - PullRequest
14 голосов
/ 16 января 2010

У меня есть модель «Account» в Rails с соответствующей таблицей «account» в базе данных. Если я уничтожу базу данных и начну сначала, поле account_id всегда будет начинаться с 1 и отсчитывать оттуда. Я хотел бы изменить начальный номер, чтобы при создании самой первой учетной записи в новой базе данных «account_id», скажем, 1000. Есть ли способ сделать это в Rails или мне нужна специализированная база данных SQL-код?

Для иллюстрации приведу упрощенную версию моей таблицы счетов:

create_table "accounts", :force => true do |t|
  t.string   "email", :null => false
  t.string   "crypted_password", :null => false
  t.string   "name", :null => false
  t.boolean  "email_verified", :default => false
end

Ответы [ 6 ]

14 голосов
/ 10 августа 2012

для PostgreSQL:

execute("ALTER SEQUENCE accounts_id_seq START with 1000 RESTART;")

см. https://www.postgresql.org/docs/current/static/sql-altersequence.html

10 голосов
/ 16 января 2010

Вам понадобится выполнить специализированный SQL-запрос, зависящий от базы данных, чтобы получить эту функциональность.

Если вы используете MySQL, вы можете добавить следующий код в миграцию после кода create_table:

execute("ALTER TABLE tbl AUTO_INCREMENT = 1000")
5 голосов
/ 15 октября 2012

Для sqlite

последовательности хранятся в таблице sqlite_sequence (name, seq)

  • Сначала проверьте, существует ли последовательность?

    select name,seq from sqlite_sequence where name = 'accounts'

если sequence.empty?

insert into sqlite_sequence(name,seq) values('accounts', 1000);

else

update sqlite_sequence set seq = 1000 where name = 'accounts';

2 голосов
/ 14 января 2014

Чистый Ruby, независимый от базы данных подход может быть:

class MyModel
  before_create do
    self.id = [1000, self.class.maximum(:id)+1].max if self.id.nil?
  end
end

Когда вы создаете много записей одновременно, это может работать не очень хорошо.

2 голосов
/ 03 апреля 2013

Другая возможная концепция может состоять в том, чтобы просто использовать переменную start_at в файле модели?

Например, определить базовый номер, например start_at = 53131, а затем ... Создайте метод доступа (мог бы назвать его «ключом»), который добавляет ваш номер start_at к реальному идентификатору вашей базы данных перед его возвратом.

И вы можете создать метод записи attr, который вычитает start_at перед сохранением ключа, что может даже не потребоваться в зависимости от вашей реализации.

Пример в псевдокоде, так что терпите меня.

class FakeModel
  attr_accessible :name
  start_at = 53121

  def self.find_by_key(key)
    find_by_id(key-start_at))
  end

  def key
    (self.id+start_at)
  end
end

Не уверен, насколько это практично или даже будет ли это работать на 100%, но, по крайней мере, вам не придется изменять базу данных, чтобы справиться с этим.

0 голосов
/ 07 февраля 2017

в SQL Server:

execute('DBCC CHECKIDENT (accounts, reseed, 1000)')

В моем случае среда разработки и производственная среда используют разные типы баз данных.

Этот блок кода запускает соответствующее выполнение в соответствии с типом БД - просто поместите его в соответствующую миграцию:

puts 'Migration trys to set initial account ID to adapter:' + ActiveRecord::Base.connection.adapter_name
case ActiveRecord::Base.connection.adapter_name
  when 'MySQL'
    execute('ALTER TABLE accounts AUTO_INCREMENT = 1000')
  when 'SQLServer'
    execute('DBCC CHECKIDENT (accounts, reseed, 1000)')
  when 'SQLite'
    begin
      execute('insert into sqlite_sequence(name,seq) values(\'accounts\', 1000);')
    rescue
      puts 'insert error... updating'
    end
    execute('update sqlite_sequence set seq = 1000 where name = \'accounts\';')
  else
    puts "cant recognize the database"
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...