在rails activerecord迁移上,索引名称太长。尝试手动添加索引,相同错误

时间:2018-09-08 22:48:33

标签: 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

我得到的错误是:

  

ArgumentError:索引名称   'index_v_mail_campaign_schedule_hours_on_v_mail_campaign_schedule_id'   表'v_mail_campaign_schedule_hours'太长;限制是64   字符

有什么建议吗?我以为我的add_index可以解决问题,但显然不行。

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:1)

是的,因此,如前所述,t.belongs_to将创建一个索引。

因此,我认为您仍然可以使用create_join_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