Лучший способ смягчить ограничение длины символа TrueError?

[UPDATE: отредактированный пример с использованием моделей Product и ProductFormFactor]

Вот что я сделал, представленный как в Rails 5, так и в Rails 4 способах добавления индекса. В этом примере я просто хочу добавить индекс в таблицу product_form_factors в столбец 'product_id'.

# Product Model
class Product < ApplicationRecord
  validates :name, presence: true

  has_many :product_form_factors
  has_many :producttype_main_categories
end

# ProductFormFactor Model
class ProductFormFactor < ApplicationRecord
  validates :name, presence: true

  belongs_to :product
end

# product_form_factors migration file (Rails 5 way)
class CreateProductFormFactors < ActiveRecord::Migration[5.0]
  def change
    create_table :product_form_factors do |t|
      t.string :name
      t.references :product, foreign_key: true

      t.timestamps

      t.index ["product_id"], name: 'by_product_id'
    end
  end
end

# product_form_factors migration file (Rails 4 way)
class CreateProductFormFactors < ActiveRecord::Migration[5.0]
  def change
    create_table :product_form_factors do |t|
      t.string :name
      t.references :product, foreign_key: true

      t.timestamps

    end

    add_index :product_form_factors, :product_id, name: 'by_product_id'
  end
end

Вот код создания таблицы product_form_factors в сгенерированном файле schema.rb:

create_table "product_form_factors", force: :cascade do |t|
  t.string   "name"
  t.integer  "product_id"
  t.datetime "created_at", null: false
  t.datetime "updated_at", null: false
  t.index ["product_id"], name: "by_product_id"
  t.index ["product_id"], name: "index_product_form_factors_on_product_id"
end

Вторая строка "t.index" была автоматически сгенерирована RoR 5 по соглашению. Помимо физического удаления этой строки кода, как мне переопределить RoR таким образом, что "db: migrate" генерирует только первую строку "t.index". Важно, потому что я столкнусь с той же проблемой с именем индекса ProductTypeSubCategory, так как я не смогу переопределить соглашение об именах RoR, которое, в свою очередь, будет генерировать имя индекса длиной более шестидесяти двух символов, что приведет к возникновению в StandardError,

Можете ли вы быть более конкретными при реализации "add_index" или ("t.index")? Я проверил документацию RoR и искал в противном случае, но мне не удалось найти информацию, которая специально решает этот вопрос об переопределении индекса.


При выполнении 'db: migrate' в моем текущем наборе файлов миграции я обнаружил следующую ошибку:

StandardError: Произошла ошибка, эта и все последующие миграции были отменены:

Индексное имя 'index_product_type_sub_categories_on_product_type_main_category_id' в таблице 'product_type_sub_categories' слишком длинное; предел составляет 62 символа

Следуя соглашению об именах Rails и основанным на именах моделей и зависимостях внешнего ключа, я ударил 62-символьный предел, указанный в предыдущем сообщении StandardError.

Я думаю, что обходным путем является использование имен псевдонимов таблиц. Например, рассмотрим следующий код модели:

class ProductTypeMainCategory < ApplicationRecord
  validates :name, presence: true

  belongs_to :product
  has_many :product_type_sub_categories
end

class ProductTypeSubCategory < ApplicationRecord
  belongs_to :product_type_main_category
end

Будет ли следующий код переписывать, чтобы устранить ошибку ограничения символа StandardError?

class ProductTypeMainCategory < ApplicationRecord
  validates :name, presence: true

  belongs_to :product
  has_many :product_type_sub_categories, as: :ptsc
end

class ProductTypeSubCategory < ApplicationRecord
  belongs_to :ptsc, polymorphic: false
end

Я основал этот код для перезаписи в Ruby on Rails Guide: Полиморфные ассоциации

Конечно, меня не интересует полиморфное поведение в этом случае, так как модели подкатегории Тип продукта/категории продукта исключительно созависимы в общей модели. У меня нет намерения повторно применять модель подкатегории типа продукта для любых других ассоциаций RoR. Вот почему я установил флаг "полиморфный" в значение "false".

Будет ли это предлагаемое решение служить разумным подходом к смягчению вышеупомянутого стандартаError, или есть ли семантически точное решение, которое я упускал из виду?

0
07 авг. '17 в 16:05
источник поделиться

Посмотрите другие вопросы по меткам или Задайте вопрос