减轻StandardError字符长度限制的最佳方法?

时间:2017-08-07 16:05:10

标签: ruby-on-rails alias standard-error character-limit

[更新:使用Product和ProductFormFactor模型编辑的示例]

这就是我所做的,用Rails 5和Rails 4两种方式表示添加索引。对于此示例,我只想在product_id_list上的product_form_factors表上添加索引。

# 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

以下是生成的'schema.rb'文件中的'product_form_factors'表创建代码:

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命名约定并基于模型名称和外键依赖关系,我达到了前面的StandardError消息中指定的62个字符的限制。

我认为解决方法是使用表别名。例如,请考虑以下型号代码:

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指南:Polymorphic Associations

当然,在这种情况下,我对多态行为不感兴趣,因为产品类型主类别/产品类型子类别模型完全依赖于整体模型。我无意在任何其他RoR关联中重新应用产品类型子类别模型。这就是我将'polymorphic'标志设置为'false'的原因。

这个提议的解决方案是否可以作为减轻上述StandardError的合理方法,还是我忽略了语义上精确的解决方案?

0 个答案:

没有答案