[更新:使用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的合理方法,还是我忽略了语义上精确的解决方案?