rails 活动记录迁移的索引名称太长。尝试手动添加索引,同样的错误
Index name too long on rails activerecord migration. Tried adding index manually, same error
所以我在添加索引时使用 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 name
'index_v_mail_campaign_schedule_hours_on_v_mail_campaign_schedule_id'
on table 'v_mail_campaign_schedule_hours' is too long; the limit is 64
characters
有什么建议吗?我以为我的 add_index
可以解决问题,但显然不行。
您可以将其更改为:
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_to
是 t.reference
的别名,指示创建外键列和相应的索引。所以 Rails 仍然会在到达 add_index
之前尝试创建索引。使用简单的 t.bigint
不会创建索引。
是的,如前所述,t.belongs_to
将创建一个索引。
因此,我认为您仍然可以使用 create_join_table
,但您只需要在 belongsTo 上指定 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
所以我在添加索引时使用 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 name 'index_v_mail_campaign_schedule_hours_on_v_mail_campaign_schedule_id' on table 'v_mail_campaign_schedule_hours' is too long; the limit is 64 characters
有什么建议吗?我以为我的 add_index
可以解决问题,但显然不行。
您可以将其更改为:
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_to
是 t.reference
的别名,指示创建外键列和相应的索引。所以 Rails 仍然会在到达 add_index
之前尝试创建索引。使用简单的 t.bigint
不会创建索引。
是的,如前所述,t.belongs_to
将创建一个索引。
因此,我认为您仍然可以使用 create_join_table
,但您只需要在 belongsTo 上指定 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