rails activerecord 迁移中的索引名称太长。尝试手动添加索引,同样的错误

Lew*_*uce 2 ruby-on-rails rails-migrations

所以我name在添加索引时通过使用参数成功创建了连接表,但我不确定为什么当我尝试创建新迁移时这不起作用:

class CreateVMailCampaignScheduleHours < ActiveRecord::Migration[5.1]
  def change
    create_table :v_mail_campaign_schedule_hours do |t|
      t.belongs_to :v_mail_campaign_schedule, foreign_key: true
      t.string :day
      t.time :start_hours
      t.time :stop_hours

      t.timestamps
    end
    add_index [:v_mail_campaign_schedule_hours, :v_mail_campaign_schedule_id], name: :v_mail_campaign_schedule_id
  end
end
Run Code Online (Sandbox Code Playgroud)

我得到的错误是:

ArgumentError:表“v_mail_campaign_schedule_hours”上的索引名称“index_v_mail_campaign_schedule_hours_on_v_mail_campaign_schedule_id”太长;限制为 64 个字符

有什么建议?我以为我add_index会做到这一点,但显然不是。

Mat*_*eer 5

您可以将其更改为以下内容:

class CreateVMailCampaignScheduleHours < ActiveRecord::Migration[5.1]
  def change
    create_table :v_mail_campaign_schedule_hours do |t|
      t.bigint :v_mail_campaign_schedule
      t.string :day
      t.time :start_hours
      t.time :stop_hours

      t.timestamps
    end
    add_index :v_mail_campaign_schedule_hours, :v_mail_campaign_schedule_id, name: :index_campaign_schedule_hours_on_schedule
  end
end
Run Code Online (Sandbox Code Playgroud)

您手动创建索引的方法是正确的。但是,t.belongs_to作为 的别名t.reference,指示创建外键列和相应的索引。所以 Rails 仍然尝试创建索引,然后到达add_index. 使用 simplet.bigint不会创建索引。