Ruby on rails rails activerecord迁移中的索引名称太长。尝试手动添加索引,出现相同错误

Ruby on rails rails activerecord迁移中的索引名称太长。尝试手动添加索引,出现相同错误,ruby-on-rails,rails-migrations,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_ke

因此,我在添加索引时使用
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
class CreateVMailActivityScheduleHours
我得到的错误是:

ArgumentError:索引名 'index_v_mail_campaign_schedule_hours_on_v_mail_campaign_schedule_id' 表上的“v_邮件、活动、时间表、时间”太长;上限是64 人物


有什么建议吗?我原以为我的
添加索引会奏效,但显然不行。

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

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
class CreateVMailActivityScheduleHours

您手动创建索引的方法是正确的。但是,
t.attown\u to
,它是
t.reference
的别名,指示创建外键列和相应的索引。因此Rails在到达
add\u index
之前仍然尝试创建索引。使用一个简单的
t.bigint
不会创建索引。

是的,正如前面所说,
t.allows\u to
将创建一个索引

因此,我认为您仍然可以使用
create\u join\u table
,但您只需要在您的物品上指定
index:false

create_join_table :v_mail_campaign_schedule_hours do |t|
  t.belongs_to :v_mail_campaign_schedule, foreign_key: true, index: false
  t.string :day
  t.time :start_hours
  t.time :stop_hours

  t.timestamps
  t.index [:v_mail_campaign_schedule_id], name: 'v_mail_campaign_schedule_id'
end