【问题标题】:Acts_as_taggable_on index too longActs_as_taggable_on 索引太长
【发布时间】:2023-03-16 15:17:01
【问题描述】:

我正在尝试使用acts_as_taggable_gem,但我遇到了迁移问题。

在自动生成的 ActsAsTaggableOnMigration 文件中,我收到以下错误

Mysql2::Error: 指定的键太长;最大密钥长度为 767 字节:创建索引 'index_taggings_on_taggable_id_and_taggable_type_and_context' 开启 'taggings' ('taggable_id', 'taggable_type', 'context')

上线add_index :taggings, [:taggable_id, :taggable_type, :context]

我过去曾在另一个项目中成功使用过 gem。唯一不同的是这次数据库字符集是utf8mb4,这是支持表情符号的要求。

我尝试减少:context 上的:limit(默认为128)无济于事

【问题讨论】:

    标签: ruby-on-rails database rails-migrations acts-as-taggable-on


    【解决方案1】:

    您可以通过两种方式解决此问题:

    将存储引擎 (MySQL) 从 InnoDB 更改为 MyISAM,MyISAM supports 1000 bytes long prefix for indexing, whereas InnoDB support 767 bytes.

    或者通过指定context长度:

    add_index :taggings, [:taggable_id, :taggable_type, :context], name: 'by_id_type_context', length: {context: 128}
    
     # => CREATE INDEX by_id_type_context ON taggings(taggable_id, taggable_type, context(128))
    

    注意:SQLite 不支持索引长度。

    【讨论】:

    • 尝试提及长度:add_index :taggings, [:taggable_id, :taggable_type, :context], name: 'by_id_type_context', length: {context: 50}
    • 尝试使用上下文长度 50
    • 我厌倦了它的长度:{context:128},它克服了那个错误。现在还有同样的错误,但以相同的方式修复它们。您能否将其作为答案,以便我可以将其标记为答案
    • 我已将此标记为答案,但后来在迁移中仍有另一个类似的问题没有解决,但我觉得还有另一个字段需要设置长度,所以我'我仍然把这个作为答案
    • @AndyRyan,如果您在这方面需要任何进一步的帮助,请告诉我。
    猜你喜欢
    • 2012-09-21
    • 2021-09-06
    • 1970-01-01
    • 2011-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-05
    相关资源
    最近更新 更多