Как использовать длинный идентификатор в приложениях Rails?

Как изменить тип (по умолчанию) для идентификаторов ActiveRecord? Int не достаточно долго, я бы предпочел долго. Я был удивлен, что нет: долго для миграций - кто-то использует только десятичную дробь?

Ответы на вопрос(11)

потому что Rails вставляет его автоматически.

Вы можете изменить любой столбец позже, как это:

change_column :foobars, :something_id, 'bigint'

Вы можете указать неосновные идентификаторы в качестве пользовательских типов при первоначальной миграции следующим образом:

create_table :tweets do |t|
  t.column :twitter_id, 'bigint'
  t.column :twitter_in_reply_to_status_id, 'bigint'
end

Где у меня есть "bigint" Вы можете поместить любой текст, который ваша база данных будет использовать для типа столбца базы данных, который вы хотите использовать (например, «unsigned long»).

Если вам нужен столбец id для bigint, самый простой способ сделать это - создать таблицу, а затем изменить столбец в той же миграции с помощью change_column.

В PostgreSQL и SQLite изменения схемы являются атомарными, поэтому в случае сбоя переноса ваша база данных не будет находиться в странном состоянии. С MySQL вам нужно быть более осторожным.

 02 июл. 2009 г., 09:29
Хорошо, я только что посмотрел это в документации по Rails, и если вы делаете t.column: foobar,: int,: limit = & gt; 8 вы получите Bigint.
 02 июл. 2009 г., 01:45
Нет, вы можете использовать change_column с первичным ключом, например: change_column: foobars,: id, & quot; bigint & quot ;. Таким образом, вы создали таблицу, а затем сразу изменили столбец идентификатора на bigint. Я все еще не думаю, что использование: limit с столбцом int будет работать (с MySQL в любом случае), потому что максимальный размер int составляет 2 ** 31-1, несмотря ни на что.
 Björn01 июл. 2009 г., 18:08
Спасибо - похоже на "нормальное" столбец с использованием limit = & gt; 8 сделает свое дело, но для primary_key это не работает. Для MySQL я теперь использовал пользовательский SQL с execute. Предпочитает change_column, но не будет иметь ту же проблему, что и первоначальное создание, а именно: limit = & gt; 8 не будет поддерживаться для столбцов первичного ключа?

:string
:text
:integer
:float
:decimal
:datetime
:timestamp
:time
:date
:binary
:boolean

Вы можете использовать: десятичное или вы можете выполнить команду напрямую, если вам нужно:

class MyMigration
  def self.up
    execute "ALTER TABLE my_table ADD id LONG"
  end
end

Как указывалось в wappos, вы можете использовать вспомогательные опции, такие как: limit, чтобы указать ActiveRecord, насколько большим должен быть столбец. Таким образом, вы бы использовали столбец: int с большим значением: limit.

 02 июл. 2009 г., 09:30
Я только что посмотрел это в документации по Rails и, если использовать: limit = & gt; 8 в столбце целых чисел вы получите bigint. Я этого не осознавал.
 Björn01 июл. 2009 г., 18:05
на самом деле: primary_key не имеет опции: limit, поэтому это не работает для столбца первичного ключа.
 01 июл. 2009 г., 08:01
& quot; Как указали в wappos, вы можете использовать вспомогательные параметры, такие как: limit, чтобы указать ActiveRecord, насколько большим должен быть столбец. Поэтому вы должны использовать столбец: int с более крупным: limit. & Quot; Я не думаю, что это сработает, если то, что он хочет, будет больше, чем будет хранить целое число. Установка большего предела не изменит максимального размера.

class CreateUsers < ActiveRecord::Migration[5.0]
  def change
    create_table :users, id: :bigserial do |t|
      t.string :name
    end
  end
end

Rails 3, MySQL:

t.column :foobar, :int, :limit => 8

Не дает мне bigint, только int. Тем не мение,

t.column :twitter_id, 'bigint'

работает отлично. (Хотя это связывает меня с MySQL.)

 17 февр. 2011 г., 06:48
Здорово! MySQL и PostgreSQL - единственные, которые мне кажутся актуальными. На самом деле, они теперь принадлежат той же организации, которую я слышу ...
 23 дек. 2011 г., 01:22
MySQL теперь принадлежит Oracle, но это не относится к PostgreSQL, что, вероятно, означает, что он будет процветать :)
 27 янв. 2011 г., 08:27
& APOS; BIGINT & APOS; как тип столбца также должен работать на PostgreSQL. Я использовал его на днях для int столбца размером 8.

создайте инициализатор следующим образом:

# config/initializers/bigint_primary_keys.rb
ActiveRecord::Base.establish_connection
ActiveRecord::ConnectionAdapters::PostgreSQLAdapter::NATIVE_DATABASE_TYPES[:primary_key] = 'bigserial primary key'

Из-за ленивой загрузки в Rails 3.2 (и, возможно, даже в более ранних версиях),ActiveRecord::ConnectionAdapters::PostgreSQLAdapter не потребуется до тех пор, пока вы не установите соединение с базой данных.

 11 янв. 2013 г., 21:17
Вам не нужно устанавливать соединение для выполнения требований, просто требуется соответствующий адаптер, например, для pg: require & active_record / connection_adapters / postgresql_adapter & reg ;, mysql: require & active_record / connection_adapters / abstract_mysql_adapter & quot; sqlite: require & active;
Решение Вопроса

http://moeffju.net/blog/using-bigint-columns-in-rails-migrations

class CreateDemo < ActiveRecord::Migration
  def self.up
    create_table :demo, :id => false do |t|
      t.integer :id, :limit => 8
    end
  end
end
See the option :id => false which disables the automatic creation of the id field The t.integer :id, :limit => 8 line will produce a 64 bit integer field
 16 янв. 2012 г., 14:42
К сожалению, это не создает столбец идентификатора в качестве первичного ключа и т. Д.
 01 дек. 2011 г., 20:39
Спасибо, отлично !! Работает и в Rails 2.3.11.
 16 окт. 2015 г., 13:51
Но, таким образом, столбец id не определяется как последовательность ...
 11 дек. 2012 г., 21:59
Я нашел это, потому что искалany поле, которое будет установлено в bigint в postgres. Информация: id является бонусом!
 16 янв. 2012 г., 15:12
Правда. Я сделал это с сырым SQL. Я прочитал сообщение и не нашел никакого способа сделать это разумно (3.0.7). Это позор. Но эй! 3.1.0 вышел на некоторое время! Удачи!

rails4, ты можешь это сделать.

Ниже приведен пример созданияDummy модель вrails4 & Амп;postgres,

xxx_migrate_dummies.rb:

class CreateDummies < ActiveRecord::Migration
  def change
    create_table :dummies, :id => false do |t|
      t.column :id, :serial8, primary_key: true
      t.string :name, :limit => 50, null: false
      t.integer :size, null: false

      t.column :create_date, :timestamptz, null: false
    end
  end
end

What it did:

It use serial8 as id type, which is 64 bit integer, and define it as primary key. It use timestamptz as datetime type, which contain the timezone info, this is important for a application that go across multiple timezones.

с учетом того, что работало для меня в последнее время.

Добавить в файл вconfig/initializers, Он объявляет новый тип столбца (адаптированный из предложения chookeat).

ActiveRecord::ConnectionAdapters::Mysql2Adapter::NATIVE_DATABASE_TYPES[:long_primary_key] = "BIGINT(20) DEFAULT NULL auto_increment PRIMARY KEY"

Миграции, которые используют длинный идентификатор, таковы:

    create_table :notification_logs, :id => false do |t|

      t.column :id, :long_primary_key
      # ...
    end

primary key тип столбца:

Вместо:

ActiveRecord::ConnectionAdapters::MysqlAdapter::NATIVE_DATABASE_TYPES[:primary_key] = "BIGINT UNSIGNED DEFAULT NULL auto_increment PRIMARY KEY"

ты должен сделать:

ActiveRecord::ConnectionAdapters::MysqlAdapter::NATIVE_DATABASE_TYPES[:primary_key] = "BIGINT(8) UNSIGNED DEFAULT NULL auto_increment PRIMARY KEY"

или вы не сможете добавитьforeign key ограничения на уровне базы данных.

 25 февр. 2013 г., 21:26
Не могли бы вы предоставить более подробную информацию о разнице междуBIGINT(**8**) а такжеBIGINTи как это влияет на создание внешнего ключа в MySQL? (Я попытался поискать и искать в документации по MySQL, но специальные символы мешают поиску.)
 14 мар. 2013 г., 20:49
Я подозреваю, что ОП просто ставит эти звездочки для акцента. Я редактировал, чтобы удалить их. Он также не прав, BTW - значения точности для чисел в MySQL влияют только на их ширину экрана, и в этом случае они не нужны.

ActiveRecord-native_db_types_override это позволяет вам изменять типы данных, которые будут использоваться в ваших миграциях.

В вашем Gemfile добавьте:

gem 'activerecord-native_db_types_override'

затем в config / environment.rb, чтобы использовать длинные идентификаторы в postgres, добавьте:

NativeDbTypesOverride.configure({
  postgres: {
    primary_key: { name: "bigserial primary key"}
  }
})

Увидеть егоПРОЧТИ МЕНЯ для актуальной информации.

default primary key column typeМиграционные файлы не место, чтобы связываться с.

Вместо этого просто вставьте это в нижней части вашегоconfig/environment.rb

ActiveRecord::ConnectionAdapters::MysqlAdapter::NATIVE_DATABASE_TYPES[:primary_key] = "BIGINT UNSIGNED DEFAULT NULL auto_increment PRIMARY KEY"

И все ваши таблицы должны быть созданы с предполагаемым типом столбца дляid:

+--------------+---------------------+------+-----+---------+----------------+
| Field        | Type                | Null | Key | Default | Extra          |
+--------------+---------------------+------+-----+---------+----------------+
| id           | bigint(20) unsigned | NO   | PRI | NULL    | auto_increment | 

После того, как вы сделали то, что вы намеревались сделать, следующий вопрос, вероятно, следующий: «Как сделать так, чтобы столбцы моего внешнего ключа имели тот же тип столбца?» поскольку не имеет смысла иметь первичный ключpeople.id какbigint(20) unsigned, а такжеperson_id бытьint(11) или что-нибудь еще?

Для этих столбцов вы можете обратиться к другим предложениям, например,

t.column :author_id, 'BIGINT UNSIGNED'
t.integer :author_id, :limit => 8

UPDATE: @Notinlist, чтобы использовать произвольный столбец для первичного ключа в произвольных таблицах, вам нужно сделатьcreate_table-change_column танец:

create_table(:users) do |t|
  # column definitions here..
end
change_column :users, :id, :float # or some other column type

например если бы я хотелguid вместо целых чисел с автоинкрементом,

create_table(:users, :primary_key => 'guid') do |t|
  # column definitions here..
end
change_column :users, :guid, :string, :limit => 36
 04 мая 2011 г., 10:32
Что делать, если я не хочу использоватьbigint для всех моих столов, только для некоторых?
 19 июн. 2012 г., 20:40
я мог быvery очень рекомендую против создания-затем-изменения, по крайней мере, в Rails 2.3.x. Если вы проверите файл db / schema.rb после выполнения этой миграции, вы заметите, что в нем нет упоминаний о ваших изменениях, поэтому любой, кто создает вашу БД из схемы (например, тесты), не будет иметь такую же структуру.
 14 сент. 2012 г., 23:57
Для адаптера MySQL добавьте:if ActiveRecord::ConnectionAdapters.local_constant_names.include?("Mysql2Adapter") ActiveRecord::ConnectionAdapters::Mysql2Adapter::NATIVE_DATABASE_TYPES[:primary_key] = "BIGINT UNSIGNED DEFAULT NULL auto_increment PRIMARY KEY" end
 02 февр. 2011 г., 02:21
Это полезный подход, но есть ли способ сделать эту базу данных независимой или это просто цена, которую платят за эту потребность?
 11 окт. 2011 г., 02:52
Похоже:primary_key => 'guid' затем изменение на строку не будет работать. Если я правильно понимаю, ссылка наprimary_key в миграции по определению создается автоинкрементное поле, поэтому оно не будет работать со строками. См. Ответ Радда Зволинскогоhere.

Ваш ответ на вопрос