Размер по умолчанию целого числа в таблицах Rails (MySQL) - PullRequest
3 голосов
/ 26 декабря 2011

Когда я запускаю

rails g model StripeCustomer user_id:integer customer_id:integer
annotate

Я получил

# == Schema Information
# Table name: stripe_customers
#  id          :integer(4)      not null, primary key
#  user_id     :integer(4)
#  customer_id :integer(4)
#  created_at  :datetime
#  updated_at  :datetime

Означает ли это, что я могу хранить только до 9 999 записей?(Я очень удивлен, насколько мал размер ключа по умолчанию).Как изменить идентификаторы по умолчанию на 7 цифр в существующих таблицах?

Спасибо.

Ответы [ 2 ]

2 голосов
/ 26 декабря 2011

Rails на самом деле означает здесь 4 байта, то есть стандартный целочисленный тип mysql (см. docs )

2 голосов
/ 26 декабря 2011

Хотя команда mysql клиента describe действительно использует ширину экрана (см. документы ), информация о схеме в вопросе OP, скорее всего, генерируется annontate_models gem get_schema_info метод, который использует атрибут limit каждого столбца. А атрибут limit - это число байтов для: двоичных и: целочисленных столбцов (см. документы ).

Метод читает (см., Как последняя строка добавляет предел):

def get_schema_info(klass, header, options = {})
  info = "# #{header}\n#\n"
  info << "# Table name: #{klass.table_name}\n#\n"

  max_size = klass.column_names.collect{|name| name.size}.max + 1
  klass.columns.each do |col|
    attrs = []
    attrs << "default(#{quote(col.default)})" unless col.default.nil?
    attrs << "not null" unless col.null
    attrs << "primary key" if col.name == klass.primary_key

    col_type = col.type.to_s
    if col_type == "decimal"
      col_type << "(#{col.precision}, #{col.scale})"
    else
      col_type << "(#{col.limit})" if col.limit
    end

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